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/
GTK4 = dependency('gtk4', version : '>=4.0.0', required : get_option('gtk4'))
if not GTK4.found()
subdir_done()
endif
###############################################################################
# Build Info
###############################################################################
GPLUGIN_GTK4_LIBRARY_VERSION = '0.1.0'
GPLUGIN_GTK4_SOURCES = [
'gplugin-gtk-plugin-page.c',
'gplugin-gtk-plugin-row.c',
'gplugin-gtk-plugin-settings-list.c',
'gplugin-gtk-view.c',
]
GPLUGIN_GTK4_HEADERS = [
'gplugin-gtk-plugin-page.h',
'gplugin-gtk-plugin-row.h',
'gplugin-gtk-plugin-settings-list.h',
'gplugin-gtk-view.h',
]
GPLUGIN_GTK4_PRIVATE_SOURCES = [
'gplugin-gtk-plugin-closures.c',
]
GPLUGIN_GTK4_PRIVATE_HEADERS = [
'gplugin-gtk-plugin-closures.h',
]
GPLUGIN_GTK4_PUBLIC_BUILT_SOURCES = [
]
GPLUGIN_GTK4_PUBLIC_BUILT_HEADERS = [
]
GPLUGIN_GTK4_GENERATED_TARGETS = [
]
###############################################################################
# Configure Files
###############################################################################
GPLUGIN_GTK4_H_INCLUDES = []
foreach header : GPLUGIN_GTK4_HEADERS
GPLUGIN_GTK4_H_INCLUDES += f'#include <gplugin-gtk4/@header@>'
endforeach
conf = configuration_data()
conf.set('GPLUGIN_GTK_H_INCLUDES', '\n'.join(GPLUGIN_GTK4_H_INCLUDES))
gplugin_gtk4_h = configure_file(
input : 'gplugin-gtk.h.in',
output : 'gplugin-gtk.h',
configuration : conf,
install : true,
install_dir : get_option('includedir') / 'gplugin-gtk4-1.0')
###############################################################################
# Resource Target
###############################################################################
gplugin_gtk4_resources = gnome.compile_resources(
'gplugin-gtk4-resources',
'data/gplugin-gtk.gresource.xml',
c_name: 'gplugin_gtk',
source_dir: 'data')
###############################################################################
# Library Target
###############################################################################
gplugin_gtk4 = library('gplugin-gtk4',
GPLUGIN_GTK4_SOURCES,
GPLUGIN_GTK4_HEADERS,
GPLUGIN_GTK4_PRIVATE_SOURCES,
GPLUGIN_GTK4_PRIVATE_HEADERS,
GPLUGIN_GTK4_PUBLIC_BUILT_SOURCES,
GPLUGIN_GTK4_PUBLIC_BUILT_HEADERS,
gplugin_gtk4_resources,
c_args : ['-DGPLUGIN_GTK_COMPILATION', '-DG_LOG_USE_STRUCTURED', '-DG_LOG_DOMAIN="GPlugin-Gtk"'],
include_directories : toplevel_inc,
dependencies : [gplugin_dep, GTK4],
version : GPLUGIN_GTK4_LIBRARY_VERSION,
install : true
)
gplugin_gtk4_inc = include_directories('.')
pkgconfig.generate(
gplugin_gtk4,
name : 'gplugin-gtk4',
description : 'GTK4 widgets for GPlugin',
filebase : 'gplugin-gtk4',
subdirs : 'gplugin-gtk4-1.0',
libraries : [gplugin],
requires : [GLIB, GOBJECT, GMODULE, GTK4],
)
###############################################################################
# GObject Introspection
###############################################################################
if get_option('introspection')
gplugin_gtk4_gir = gnome.generate_gir(
gplugin_gtk4,
sources : [
GPLUGIN_GTK4_SOURCES,
GPLUGIN_GTK4_HEADERS,
GPLUGIN_GTK4_PUBLIC_BUILT_SOURCES,
GPLUGIN_GTK4_PUBLIC_BUILT_HEADERS,
],
includes : [gplugin_gir[0], 'Gtk-4.0'],
namespace : 'GPluginGtk4',
nsversion : '1.0',
symbol_prefix : 'gplugin_gtk',
identifier_prefix : 'GPluginGtk',
install : true,
header : 'gplugin-gtk.h',
export_packages: ['gplugin-gtk4'],
dependencies : [gplugin_dep],
extra_args : ['--quiet', '-DGPLUGIN_GTK_COMPILATION'])
GPLUGIN_GTK4_GENERATED_TARGETS += gplugin_gtk4_gir
endif
###############################################################################
# Library Dependency Object
###############################################################################
gplugin_gtk4_dep = declare_dependency(
include_directories: [toplevel_inc, gplugin_gtk4_inc],
link_with : [gplugin, gplugin_gtk4],
sources : [
GPLUGIN_GTK4_PUBLIC_BUILT_HEADERS,
GPLUGIN_GTK4_GENERATED_TARGETS,
],
dependencies : [GLIB, GOBJECT, GTK4],
)
meson.override_dependency('gplugin-gtk4', gplugin_gtk4_dep)
###############################################################################
# Install Stuff
###############################################################################
install_headers(
GPLUGIN_GTK4_HEADERS,
subdir : 'gplugin-gtk4-1.0/gplugin-gtk4'
)
###############################################################################
# subdirectories
###############################################################################
subdir('reference')