]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: make sure to destroy all name watching bus slots when we are kicked off the...
authorLennart Poettering <lennart@poettering.net>
Fri, 10 Feb 2017 02:54:48 +0000 (03:54 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 10 Feb 2017 02:54:48 +0000 (21:54 -0500)
Fixes: #4528
src/core/dbus.c
src/core/unit.c

index a3f701c064598c1c27c8b0b727490879f4a4aa27..0493e5786c5de22624e2f6665667d8c955727b2d 100644 (file)
@@ -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);
index 90d7eea95629d27e59cc80e339c89627da9f391a..5e4b1567d8f8ca9f7e3faff90605be5249c7a441 100644 (file)
@@ -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);
 }