]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
Bug 15571: Clean up GUID-less connections correctly (Scott James Remnant)
authorColin Walters <walters@verbum.org>
Sat, 31 May 2008 00:25:36 +0000 (20:25 -0400)
committerColin Walters <walters@verbum.org>
Sat, 31 May 2008 00:25:36 +0000 (20:25 -0400)
* dbus/dbus-connection.c (connection_forget_shared_unlocked):
  Remove shared connections which lack a GUID from the list that
  caches those, otherwise references to them will remain after
  they have been freed.
* test/name-test/test-privserver-client.c: Update test to
try GUID-less connections too.

dbus/dbus-connection.c
test/name-test/test-privserver-client.c

index 7b13b2498233a15edfd4ffcb7c07db5b51291ec9..1f427dd3b8c7a655c7607e4a50f092bad1661de5 100644 (file)
@@ -1678,21 +1678,26 @@ connection_forget_shared_unlocked (DBusConnection *connection)
   if (!connection->shareable)
     return;
   
+  _DBUS_LOCK (shared_connections);
+      
   if (connection->server_guid != NULL)
     {
       _dbus_verbose ("dropping connection to %s out of the shared table\n",
                      connection->server_guid);
       
-      _DBUS_LOCK (shared_connections);
-      
       if (!_dbus_hash_table_remove_string (shared_connections,
                                            connection->server_guid))
         _dbus_assert_not_reached ("connection was not in the shared table");
       
       dbus_free (connection->server_guid);
       connection->server_guid = NULL;
-      _DBUS_UNLOCK (shared_connections);
     }
+  else
+    {
+      _dbus_list_remove (&shared_connections_no_guid, connection);
+    }
+
+  _DBUS_UNLOCK (shared_connections);
   
   /* remove our reference held on all shareable connections */
   _dbus_connection_unref_unlocked (connection);
index 5a3f399ba96eabec1e31b246d74c591b70982dd3..239b7bdf7264a3539d0b0e49b07231778bb44493 100644 (file)
@@ -27,7 +27,7 @@ filter_private_message (DBusConnection     *connection,
 }
 
 static void
-open_shutdown_private_connection ()
+open_shutdown_private_connection (dbus_bool_t use_guid)
 {
   DBusError error;
   DBusLoop *loop;
@@ -35,7 +35,8 @@ open_shutdown_private_connection ()
   DBusMessage *msg;
   DBusMessage *reply;
   DBusConnection *privconn;
-  const char *addr;
+  char *addr;
+  char *comma;
 
   dbus_error_init (&error);
 
@@ -55,8 +56,15 @@ open_shutdown_private_connection ()
   if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &addr, DBUS_TYPE_INVALID))
     die ("couldn't parse message replym\n");
   printf ("got private temp address %s\n", addr);
-
+  addr = strdup (addr);
+  if (!use_guid)
+    {
+      char *comma = strrchr (addr, ',');
+      if (comma)
+        *comma = '\0';
+    }
   privconn = dbus_connection_open (addr, &error);
+  free (addr);
   if (!privconn)
     die ("couldn't connect to server direct connection: %s\n", error.message);
   dbus_message_unref (reply);
@@ -88,11 +96,19 @@ open_shutdown_private_connection ()
 int
 main (int argc, char *argv[])
 {
-  open_shutdown_private_connection ();
+  open_shutdown_private_connection (TRUE);
+
+  dbus_shutdown ();
+
+  open_shutdown_private_connection (TRUE);
+
+  dbus_shutdown ();
+
+  open_shutdown_private_connection (FALSE);
 
   dbus_shutdown ();
 
-  open_shutdown_private_connection ();
+  open_shutdown_private_connection (FALSE);
 
   dbus_shutdown ();