gdbus: Fix race condition with creating duplicate client proxies
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 16 Dec 2012 00:16:28 +0000 (01:16 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 19 Dec 2012 02:43:28 +0000 (03:43 +0100)
gdbus/client.c

index 76e4cc1..d7d9e36 100644 (file)
@@ -196,6 +196,23 @@ static void prop_entry_free(gpointer data)
        g_free(prop);
 }
 
+static GDBusProxy *proxy_lookup(GDBusClient *client, const char *path,
+                                               const char *interface)
+{
+       GList *list;
+
+       for (list = g_list_first(client->proxy_list); list;
+                                               list = g_list_next(list)) {
+               GDBusProxy *proxy = list->data;
+
+               if (g_str_equal(proxy->interface, interface) == TRUE &&
+                               g_str_equal(proxy->obj_path, path) == TRUE)
+                       return proxy;
+        }
+
+       return NULL;
+}
+
 static GDBusProxy *proxy_new(GDBusClient *client, const char *path,
                                                const char *interface)
 {
@@ -621,6 +638,12 @@ static void parse_properties(GDBusClient *client, const char *path,
        if (g_str_equal(interface, DBUS_INTERFACE_PROPERTIES) == TRUE)
                return;
 
+       proxy = proxy_lookup(client, path, interface);
+       if (proxy) {
+               update_properties(proxy, iter);
+               return;
+       }
+
        proxy = proxy_new(client, path, interface);
        if (proxy == NULL)
                return;