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