gdbus: Don't refresh objects/props if disconnected
authorArman Uguray <armansito@chromium.org>
Sat, 21 Feb 2015 01:56:47 +0000 (17:56 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 22 Feb 2015 18:42:25 +0000 (19:42 +0100)
If g_dbus_client_set_proxy_handlers gets called from within a
proxy_removed callback, the code may end up refreshing the proxy's
properties and incorrectly access the client's proxy_list as it gets
freed. This patch fixes this, so that get_managed_objects does nothing
if it gets called during a service disconnect.

gdbus/client.c

index eb68a0f8287d5b0bb11068af7b7a80feb531b42c..238b34828ea6f12df40e08dee38084a0200e0174 100644 (file)
@@ -1107,6 +1107,9 @@ static void get_managed_objects(GDBusClient *client)
 {
        DBusMessage *msg;
 
+       if (!client->connected)
+               return;
+
        if (!client->proxy_added && !client->proxy_removed) {
                refresh_properties(client);
                return;
@@ -1142,13 +1145,13 @@ static void service_connect(DBusConnection *conn, void *user_data)
 
        g_dbus_client_ref(client);
 
+       client->connected = TRUE;
+
        if (client->connect_func)
                client->connect_func(conn, client->connect_data);
 
        get_managed_objects(client);
 
-       client->connected = TRUE;
-
        g_dbus_client_unref(client);
 }
 
@@ -1156,13 +1159,13 @@ static void service_disconnect(DBusConnection *conn, void *user_data)
 {
        GDBusClient *client = user_data;
 
+       client->connected = FALSE;
+
        g_list_free_full(client->proxy_list, proxy_free);
        client->proxy_list = NULL;
 
-       if (client->disconn_func) {
+       if (client->disconn_func)
                client->disconn_func(conn, client->disconn_data);
-               client->connected = FALSE;
-       }
 }
 
 static DBusHandlerResult message_filter(DBusConnection *connection,