gplugin/gplugin

fix memory leaks in gplugin_file_source

14 months ago, Markus Fischer
d821f171d4c6
fix memory leaks in gplugin_file_source

leaks encountered:
## libpurple test_contact_info and test_person
```
==5998== 16 bytes in 1 blocks are definitely lost in loss record 1,996 of 6,277
==5998== at 0x48417E4: malloc (vg_replace_malloc.c:393)
==5998== by 0x4A6FA18: g_malloc (in /usr/lib64/libglib-2.0.so.0.7400.4)
==5998== by 0x4A88540: g_slice_alloc (in /usr/lib64/libglib-2.0.so.0.7400.4)
==5998== by 0x4A89675: g_slist_prepend (in /usr/lib64/libglib-2.0.so.0.7400.4)
==5998== by 0x4F0DA9E: gplugin_file_source_add_loader (gplugin-file-source.c:112)
==5998== by 0x4F0DCF1: gplugin_file_source_update_loaders (gplugin-file-source.c:179)
==5998== by 0x4F0E971: gplugin_file_source_constructed (gplugin-file-source.c:524)
==5998== by 0x49CF002: ??? (in /usr/lib64/libgobject-2.0.so.0.7400.4)
==5998== by 0x49D0C33: g_object_new_valist (in /usr/lib64/libgobject-2.0.so.0.7400.4)
==5998== by 0x49D1250: g_object_new (in /usr/lib64/libgobject-2.0.so.0.7400.4)
==5998== by 0x4F0EC51: gplugin_file_source_new (gplugin-file-source.c:607)
==5998== by 0x4F08019: gplugin_manager_refresh (gplugin-manager.c:874)
```
## gplugin tests
```
==23357== 456 (16 direct, 440 indirect) bytes in 1 blocks are definitely lost in loss record 535 of 557
==23357== at 0x48417E4: malloc (vg_replace_malloc.c:393)
==23357== by 0x48E4828: g_malloc (in /usr/lib64/libglib-2.0.so.0.7400.5)
==23357== by 0x48FD281: g_slice_alloc (in /usr/lib64/libglib-2.0.so.0.7400.5)
==23357== by 0x48FE6A8: g_slist_copy_deep (in /usr/lib64/libglib-2.0.so.0.7400.5)
==23357== by 0x485B252: gplugin_manager_find_plugins (gplugin-manager.c:934)
==23357== by 0x4861216: gplugin_file_source_scan (gplugin-file-source.c:349)
==23357== by 0x48622A9: gplugin_source_scan (gplugin-source.c:66)
==23357== by 0x485B041: gplugin_manager_refresh (gplugin-manager.c:881)
==23357== by 0x109464: test_gplugin_init_uninit_with_double_refresh_plugins (test-core.c:115)
==23357== by 0x49079DD: ??? (in /usr/lib64/libglib-2.0.so.0.7400.5)
==23357== by 0x490774C: ??? (in /usr/lib64/libglib-2.0.so.0.7400.5)
==23357== by 0x4907EE1: g_test_run_suite (in /usr/lib64/libglib-2.0.so.0.7400.5)
```

Testing Done:
Ran all gplugin tests and test_contact_info and test_person from libpurple in valgrind without encountering above leaks or any invalid reads/writes.

Reviewed at https://reviews.imfreedom.org/r/2255/
## clang-format
GPlugin uses [clang-format][1] to automatically format code. Version 9 (or
higher) is required. Earlier versions will fail on the options in the
`.clang-format` file.
You can use clang-format in one or more of the following ways:
* Integrate it into your editor. The [clang-format page][1] has examples.
* Use a Mercurial [hook script][2].
* Run `ninja clang-format` from your build directory.
* Worst case, run `clang-format -i SOME_FILE` manually.
### GObject Functions
GObject and GPlugin have functions which take pairs of name/value arguments:
* `g_object_get()`
* `g_object_new()`
* `gplugin_plugin_info_new()`
If code calling one of these functions with such pairs has to be wrapped, the
pairs are easier to read and edit with manual formatting to group the name and
value on the same line (but otherwise following the usual formatting that
clang-format would apply):
```
/* clang-format off */
g_object_get(
G_OBJECT(info),
"name", &name,
"summary", &summary,
NULL);
/* clang-format on */
```
### Debian
Debian and derivatives (e.g. Ubuntu) ship clang-format version 9 in a package
named `clang-format-9`. The package named `clang-format` is currently an
older version. Additionally, the `clang-format-9` package will not place a
`clang-format` in the `$PATH`. Install as follows:
```
sudo apt install clang-format-9
sudo update-alternatives --set clang-format /usr/bin/clang-format-9
```
## convey
GPlugin uses [Convey][3] for CI. You can run the integration tests locally.
To initially setup Convey, which requires Docker:
1. Install Convey. You can use a pre-built binary from [convey's Downloads
page][4]; put that (or a symlink) in your `$PATH` named `convey`.
For now, avoid version 0.14.
2. Install Docker. On Debian systems, use: `sudo apt install docker.io`
3. Add yourself to the `docker` group. Adding yourself to a group does not
add that group to your existing session, so the first time you will need to
get a shell in that group with `newgrp docker` or by rebooting.
To run all of the integration tests, run the "all" metaplan:
```
convey all
```
To run a specific test/platform, run the plan directly:
```
convey alpine-edge-amd64
```
To get a list of metaplans and their plans:
```
convey list metaplans
```
[1]: https://clang.llvm.org/docs/ClangFormat.html
[2]: https://hg.mozilla.org/projects/nss/file/default/coreconf/precommit.clang-format.sh
[3]: https://keep.imfreedom.org/grim/convey
[4]: https://bintray.com/pidgin/releases/convey