]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
containers: Share code for what happens when we lose a connection
authorSimon McVittie <smcv@collabora.com>
Tue, 3 Jul 2018 19:26:33 +0000 (20:26 +0100)
committerSimon McVittie <smcv@collabora.com>
Thu, 30 Aug 2018 16:39:43 +0000 (17:39 +0100)
This improves test coverage, because
bus_container_instance_lost_connection() was previously only called
when we failed to set up a connection with a server due to OOM, but
it is now also called (instead of being duplicated) when we are told
to clean up a connection because it has disconnected.

To make sure that connections from containers can never cheat their
way into being treated as uncontained, do not set their
contained_data_slot to NULL.

Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=107739

bus/containers.c

index ece12eab93975f5d3cf16ff3e8bbe79e9466c603..5542e16bc677bda4357cf1befc95945c69c7f95c 100644 (file)
@@ -482,7 +482,13 @@ bus_container_instance_lost_connection (BusContainerInstance *instance,
   if (_dbus_list_remove (&instance->connections, connection))
     dbus_connection_unref (connection);
 
-  dbus_connection_set_data (connection, contained_data_slot, NULL, NULL);
+  /* We don't set connection's contained_data_slot to NULL, to make sure
+   * that once we have marked a connection as belonging to a container,
+   * there is no going back: even if we somehow keep a reference to it
+   * around, it will never be treated as uncontained. The connection's
+   * reference to the instance will be cleaned up on last-unref, and
+   * the list removal above ensures that the instance does not hold a
+   * circular ref to the connection, so the last-unref will happen. */
 
   dbus_connection_unref (connection);
   bus_container_instance_unref (instance);
@@ -1433,14 +1439,7 @@ bus_containers_remove_connection (BusContainers *self,
   instance = connection_get_instance (connection);
 
   if (instance != NULL)
-    {
-      bus_container_instance_ref (instance);
-
-      if (_dbus_list_remove (&instance->connections, connection))
-        dbus_connection_unref (connection);
-
-      bus_container_instance_unref (instance);
-    }
+    bus_container_instance_lost_connection (instance, connection);
 
   dbus_connection_unref (connection);
 #endif /* DBUS_ENABLE_CONTAINERS */