From: Simon McVittie Date: Tue, 3 Jul 2018 19:26:33 +0000 (+0100) Subject: containers: Share code for what happens when we lose a connection X-Git-Tag: dbus-1.13.8~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2798ecc45f91629fa75297e8de77594d7d83d957;p=thirdparty%2Fdbus.git containers: Share code for what happens when we lose a connection 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 Reviewed-by: Philip Withnall Bug: https://bugs.freedesktop.org/show_bug.cgi?id=107739 --- diff --git a/bus/containers.c b/bus/containers.c index ece12eab9..5542e16bc 100644 --- a/bus/containers.c +++ b/bus/containers.c @@ -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 */