sd-bus: break the loop in bus_ensure_running() if the bus is not connecting

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.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2020-10-14 14:03:13 +02:00 committed by Yu Watanabe
parent 720f477f2d
commit 93a59b1ae5

View 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;