|
|
f4d4e0 |
From e525ce5713f8263258c2cdf687adc67108425f6a Mon Sep 17 00:00:00 2001
|
|
|
f4d4e0 |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
f4d4e0 |
Date: Fri, 15 Dec 2017 22:24:16 +0100
|
|
|
f4d4e0 |
Subject: [PATCH] sd-bus: when attached to an sd-event loop, disconnect on
|
|
|
f4d4e0 |
processing errors
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
If we can't process the bus for some reason we shouldn't just disable
|
|
|
f4d4e0 |
the event source, but log something and give up on the connection. Hence
|
|
|
f4d4e0 |
do that, and disconnect.
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
(cherry-picked from commit 5ae37ad833583e6c1c7765767b7f8360afca3b07)
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
Resolves: #1817504
|
|
|
f4d4e0 |
---
|
|
|
f4d4e0 |
src/libsystemd/sd-bus/sd-bus.c | 45 +++++++++++++++++++++-------------
|
|
|
f4d4e0 |
1 file changed, 28 insertions(+), 17 deletions(-)
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
|
|
|
f4d4e0 |
index 44ed2c7497..2c8cc66367 100644
|
|
|
f4d4e0 |
--- a/src/libsystemd/sd-bus/sd-bus.c
|
|
|
f4d4e0 |
+++ b/src/libsystemd/sd-bus/sd-bus.c
|
|
|
f4d4e0 |
@@ -3037,8 +3037,10 @@ static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userd
|
|
|
f4d4e0 |
assert(bus);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_bus_process(bus, NULL);
|
|
|
f4d4e0 |
- if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
+ if (r < 0) {
|
|
|
f4d4e0 |
+ log_debug_errno(r, "Processing of bus failed, closing down: %m");
|
|
|
f4d4e0 |
+ bus_enter_closing(bus);
|
|
|
f4d4e0 |
+ }
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
return 1;
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
@@ -3050,8 +3052,10 @@ static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
|
|
|
f4d4e0 |
assert(bus);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_bus_process(bus, NULL);
|
|
|
f4d4e0 |
- if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
+ if (r < 0) {
|
|
|
f4d4e0 |
+ log_debug_errno(r, "Processing of bus failed, closing down: %m");
|
|
|
f4d4e0 |
+ bus_enter_closing(bus);
|
|
|
f4d4e0 |
+ }
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
return 1;
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
@@ -3065,38 +3069,45 @@ static int prepare_callback(sd_event_source *s, void *userdata) {
|
|
|
f4d4e0 |
assert(bus);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
e = sd_bus_get_events(bus);
|
|
|
f4d4e0 |
- if (e < 0)
|
|
|
f4d4e0 |
- return e;
|
|
|
f4d4e0 |
+ if (e < 0) {
|
|
|
f4d4e0 |
+ r = e;
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
+ }
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
if (bus->output_fd != bus->input_fd) {
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
|
|
|
f4d4e0 |
if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
|
|
|
f4d4e0 |
- if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
- } else {
|
|
|
f4d4e0 |
+ } else
|
|
|
f4d4e0 |
r = sd_event_source_set_io_events(bus->input_io_event_source, e);
|
|
|
f4d4e0 |
- if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
- }
|
|
|
f4d4e0 |
+ if (r < 0)
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_bus_get_timeout(bus, &until);
|
|
|
f4d4e0 |
if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
if (r > 0) {
|
|
|
f4d4e0 |
int j;
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
j = sd_event_source_set_time(bus->time_event_source, until);
|
|
|
f4d4e0 |
- if (j < 0)
|
|
|
f4d4e0 |
- return j;
|
|
|
f4d4e0 |
+ if (j < 0) {
|
|
|
f4d4e0 |
+ r = j;
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
+ }
|
|
|
f4d4e0 |
}
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
|
|
|
f4d4e0 |
if (r < 0)
|
|
|
f4d4e0 |
- return r;
|
|
|
f4d4e0 |
+ goto fail;
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
+ return 1;
|
|
|
f4d4e0 |
+
|
|
|
f4d4e0 |
+fail:
|
|
|
f4d4e0 |
+ log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
|
|
|
f4d4e0 |
+ bus_enter_closing(bus);
|
|
|
f4d4e0 |
|
|
|
f4d4e0 |
return 1;
|
|
|
f4d4e0 |
}
|