gdbus: Remove proxies when client disconnects
authorHenrique Dante de Almeida <hdante@profusion.mobi>
Mon, 27 May 2013 17:15:34 +0000 (14:15 -0300)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 19 Jun 2013 06:11:35 +0000 (08:11 +0200)
Remove proxies and generate proxy_removed callbacks even when there are
no corresponding InterfaceRemoved signals.

This patch fixes having zombie gdbus proxy object when a server
disconnects without sending InterfaceRemoved signals. These objects
may interact with new server instances, for example, making
InterfaceAdded signals of new objects with the same name be filtered
out as duplicated, or staying allocated, but unused, if the new server
doesn't reuse the object paths. Note that as a side-effect, the
lifetime of a gdbus proxy becomes stricter: it lives at most for the
duration of a single connection to a single instance of a server
process.

gdbus/client.c

index f700b7ee450983e3e5327306947ae99dea59bd92..d80e2523d7275706d02416e0c4fee0d8e1618d45 100644 (file)
@@ -1153,6 +1153,10 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
 
                if (*new == '\0' && client->unique_name != NULL &&
                                g_str_equal(old, client->unique_name) == TRUE) {
+
+                       g_list_free_full(client->proxy_list, proxy_free);
+                       client->proxy_list = NULL;
+
                        if (client->disconn_func)
                                client->disconn_func(client->dbus_conn,
                                                        client->disconn_data);