]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: break the loop in bus_ensure_running() if the bus is not connecting
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Oct 2020 12:03:13 +0000 (14:03 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 15 Oct 2020 02:15:03 +0000 (11:15 +0900)
This might fix #17025:
> the call trace is
> bus_ensure_running -> sd_bus_process -> bus_process_internal -> process_closeing --> sd_bus_close
>                                                                                  |
>                                                                                  \-> process_match

We ended doing callouts to the Disconnected matches from bus_ensure_running()
and shouldn't. bus_ensure_running() should never do callouts. This change
should fix this however: once we notice that the connection is going down we
will now fail instantly with ENOTOCONN instead of calling any callbacks.

src/libsystemd/sd-bus/sd-bus.c

index 015a215c420ae3f6b790cc11e52330ad7b0a952a..f9d426f4f2140c936c32e3c548787dfa7d462b00 100644 (file)
@@ -2120,12 +2120,13 @@ int bus_ensure_running(sd_bus *bus) {
 
         assert(bus);
 
-        if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
-                return -ENOTCONN;
         if (bus->state == BUS_RUNNING)
                 return 1;
 
         for (;;) {
+                if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
+                        return -ENOTCONN;
+
                 r = sd_bus_process(bus, NULL);
                 if (r < 0)
                         return r;