diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2014-05-26 12:01:13 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2014-05-26 14:53:20 +0200 |
commit | 008c6941aaf20d83a246b5dd4fd38f61ea2fbca0 (patch) | |
tree | c84bbf9332bdb2bbebb96172e037e9e5c2dbdfcc /src | |
parent | bed0f434ff23931b1ea98116ebe5f3219873dbb3 (diff) |
Fix GVariantBuilder leaks
When using g_variant_builder_new(), we must call
g_variant_builder_unref() to free it:
"You should call g_variant_builder_unref() on the return value when it
is no longer needed. The memory will not be automatically freed by any
other call.
In most cases it is easier to place a GVariantBuilder directly on the
stack of the calling function and initialise it with
g_variant_builder_init()."
One of these leaks showed up in valgrind as:
==20702== 16,416 bytes in 114 blocks are definitely lost in loss record 2,114 of 2,115
==20702== at 0x4A0645D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==20702== by 0x56EDDF2: g_malloc (gmem.c:97)
==20702== by 0x570691C: g_slice_alloc (gslice.c:1007)
==20702== by 0x5729743: g_variant_builder_new (gvariant.c:3169)
==20702== by 0x40297B: ibus_config_dconf_get_values (config.c:413)
==20702== by 0x4E44FF2: ibus_config_service_service_method_call (ibusconfigservice.c:214)
==20702== by 0x4E33249: ibus_service_service_method_call_cb (ibusservice.c:395)
==20702== by 0x51880D8: call_in_idle_cb (gdbusconnection.c:4875)
==20702== by 0x56E81D7: g_idle_dispatch (gmain.c:5319)
==20702== by 0x56E58F1: g_main_dispatch (gmain.c:3064)
==20702== by 0x56E6667: g_main_context_dispatch (gmain.c:3663)
==20702== by 0x56E6859: g_main_context_iterate (gmain.c:3734)
Diffstat (limited to 'src')
-rw-r--r-- | src/ibuscomponent.c | 2 | ||||
-rw-r--r-- | src/ibusengine.c | 1 |
2 files changed, 3 insertions, 0 deletions
diff --git a/src/ibuscomponent.c b/src/ibuscomponent.c index c03c9e03..2364b24a 100644 --- a/src/ibuscomponent.c +++ b/src/ibuscomponent.c @@ -365,6 +365,7 @@ ibus_component_serialize (IBusComponent *component, g_variant_builder_add (array, "v", ibus_serializable_serialize ((IBusSerializable *)p->data)); } g_variant_builder_add (builder, "av", array); + g_variant_builder_unref (array); /* serialize engine desc list */ array = g_variant_builder_new (G_VARIANT_TYPE ("av")); @@ -372,6 +373,7 @@ ibus_component_serialize (IBusComponent *component, g_variant_builder_add (array, "v", ibus_serializable_serialize ((IBusSerializable *)p->data)); } g_variant_builder_add (builder, "av", array); + g_variant_builder_unref (array); return TRUE; } diff --git a/src/ibusengine.c b/src/ibusengine.c index 7543c99c..53d57df1 100644 --- a/src/ibusengine.c +++ b/src/ibusengine.c @@ -1286,6 +1286,7 @@ ibus_engine_dbus_property_changed (IBusEngine *engine, IBUS_INTERFACE_ENGINE, builder, NULL)); + g_variant_builder_unref (builder); error = NULL; connection = ibus_service_get_connection ((IBusService *)engine); |