GDbusProxy: Plug memory leak.

proxy->priv->name_owner gets overwritten in async_init_data_set_name_owner() on the
assumption that it will always be NULL when we get there. However,
on_name_owner_changed() can run first, and it does set name_owner.

==20126== 42 bytes in 6 blocks are definitely lost in loss record 15,174 of 48,256
==20126==    at 0x4C280F3: malloc (vg_replace_malloc.c:299)
==20126==    by 0x7541D00: g_malloc (gmem.c:104)
==20126==    by 0x7558FEE: g_strdup (gstrfuncs.c:364)
==20126==    by 0x6DF8E4F: on_name_owner_changed (gdbusproxy.c:1399)
==20126==    by 0x6DE94C4: emit_signal_instance_in_idle_cb (gdbusconnection.c:3743)
==20126==    by 0x753C315: g_main_dispatch (gmain.c:3066)
==20126==    by 0x753C315: g_main_context_dispatch (gmain.c:3642)
==20126==    by 0x753C667: g_main_context_iterate.isra.24 (gmain.c:3713)
==20126==    by 0x753CA69: g_main_loop_run (gmain.c:3907)
==20126==    by 0x5E38000: meta_run (main.c:556)
==20126==    by 0x401EC0: main (main.c:441)

https://bugzilla.gnome.org/show_bug.cgi?id=755439
This commit is contained in:
Hans Petter Jansson 2016-06-03 03:16:58 +02:00
parent 39a22880b6
commit ae048625fe

View File

@ -1454,8 +1454,9 @@ async_init_data_set_name_owner (GTask *task,
if (name_owner != NULL) if (name_owner != NULL)
{ {
/* it starts as NULL anyway */
G_LOCK (properties_lock); G_LOCK (properties_lock);
/* Must free first, since on_name_owner_changed() could run before us */
g_free (proxy->priv->name_owner);
proxy->priv->name_owner = g_strdup (name_owner); proxy->priv->name_owner = g_strdup (name_owner);
G_UNLOCK (properties_lock); G_UNLOCK (properties_lock);
} }