From 00138ec85f61f06fbe3f61cf0e60306aab23b13a Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 3 Jul 2018 20:26:33 +0100 Subject: [PATCH 9/9] 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 --- bus/containers.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/bus/containers.c b/bus/containers.c index ece12eab..5542e16b 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 */ -- 2.19.0.rc1