From 93a59b1ae5d3bcb0ec1488ebc13d0d1ff4d1729a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 14 Oct 2020 14:03:13 +0200 Subject: [PATCH] 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. URL: https://github.com/systemd/systemd/commit/93a59b1ae5d3bcb0ec1488ebc13d0d1ff4d1729a Reference: https://github.com/systemd/systemd/commit/93a59b1ae5d3bcb0ec1488ebc13d0d1ff4d1729a Conflict: NA --- src/libsystemd/sd-bus/sd-bus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 015a215c42..f9d426f4f2 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -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; -- 2.23.0