summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2014-05-26 12:01:13 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2014-05-26 14:53:20 +0200
commit008c6941aaf20d83a246b5dd4fd38f61ea2fbca0 (patch)
treec84bbf9332bdb2bbebb96172e037e9e5c2dbdfcc /src
parentbed0f434ff23931b1ea98116ebe5f3219873dbb3 (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.c2
-rw-r--r--src/ibusengine.c1
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);