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 <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=107739
This commit is contained in:
Simon McVittie 2018-07-03 20:26:33 +01:00
parent 64a6366027
commit 2798ecc45f

View 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 */