diff --git a/bus/connection.c b/bus/connection.c index 53605fa3..d53522f5 100644 --- a/bus/connection.c +++ b/bus/connection.c @@ -23,6 +23,8 @@ #include #include "connection.h" + +#include "containers.h" #include "dispatch.h" #include "policy.h" #include "services.h" @@ -306,6 +308,9 @@ bus_connection_disconnected (DBusConnection *connection) d->link_in_monitors = NULL; } + bus_containers_remove_connection (bus_context_get_containers (d->connections->context), + connection); + if (d->link_in_connection_list != NULL) { if (d->name != NULL) diff --git a/bus/containers.c b/bus/containers.c index 23193ac7..e30feb37 100644 --- a/bus/containers.c +++ b/bus/containers.c @@ -812,3 +812,41 @@ bus_containers_stop_listening (BusContainers *self) } #endif /* DBUS_ENABLE_CONTAINERS */ + +void +bus_containers_remove_connection (BusContainers *self, + DBusConnection *connection) +{ +#ifdef DBUS_ENABLE_CONTAINERS + BusContainerCreatorData *creator_data; + + dbus_connection_ref (connection); + creator_data = dbus_connection_get_data (connection, + container_creator_data_slot); + + if (creator_data != NULL) + { + DBusList *iter; + DBusList *next; + + for (iter = _dbus_list_get_first_link (&creator_data->instances); + iter != NULL; + iter = next) + { + BusContainerInstance *instance = iter->data; + + /* Remember where we got to before we do something that might free + * iter and instance */ + next = _dbus_list_get_next_link (&creator_data->instances, iter); + + _dbus_assert (instance->creator == connection); + + /* This will invalidate iter and instance if there are no open + * connections to this instance */ + bus_container_instance_stop_listening (instance); + } + } + + dbus_connection_unref (connection); +#endif /* DBUS_ENABLE_CONTAINERS */ +} diff --git a/bus/containers.h b/bus/containers.h index 9a7ac0ba..e51d6ba1 100644 --- a/bus/containers.h +++ b/bus/containers.h @@ -39,6 +39,9 @@ dbus_bool_t bus_containers_handle_add_server (DBusConnection *connecti dbus_bool_t bus_containers_supported_arguments_getter (BusContext *context, DBusMessageIter *var_iter); +void bus_containers_remove_connection (BusContainers *self, + DBusConnection *connection); + static inline void bus_clear_containers (BusContainers **containers_p) {