From 8367fea557cffaa6e870ccf1b94a063f560a922f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 10 Feb 2017 03:54:48 +0100 Subject: core: make sure to destroy all name watching bus slots when we are kicked off the bus (#5294) Fixes: #4528 --- src/core/dbus.c | 12 ++++++++++++ src/core/unit.c | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/dbus.c b/src/core/dbus.c index a3f701c064..0493e5786c 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -1041,6 +1041,7 @@ int bus_init(Manager *m, bool try_bus_connect) { static void destroy_bus(Manager *m, sd_bus **bus) { Iterator i; + Unit *u; Job *j; assert(m); @@ -1049,6 +1050,17 @@ static void destroy_bus(Manager *m, sd_bus **bus) { if (!*bus) return; + /* Make sure all bus slots watching names are released. */ + HASHMAP_FOREACH(u, m->watch_bus, i) { + if (!u->match_bus_slot) + continue; + + if (sd_bus_slot_get_bus(u->match_bus_slot) != *bus) + continue; + + u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot); + } + /* Get rid of tracked clients on this bus */ if (m->subscribed && sd_bus_track_get_bus(m->subscribed) == *bus) m->subscribed = sd_bus_track_unref(m->subscribed); diff --git a/src/core/unit.c b/src/core/unit.c index 90d7eea956..5e4b1567d8 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -2650,7 +2650,7 @@ void unit_unwatch_bus_name(Unit *u, const char *name) { assert(u); assert(name); - hashmap_remove_value(u->manager->watch_bus, name, u); + (void) hashmap_remove_value(u->manager->watch_bus, name, u); u->match_bus_slot = sd_bus_slot_unref(u->match_bus_slot); } -- cgit v1.2.3-54-g00ecf