]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
stdio-bridge: properly handle org.freedesktop.DBus.Local.Disconnected signal
authorLennart Poettering <lennart@poettering.net>
Tue, 28 Nov 2023 22:29:50 +0000 (23:29 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 29 Nov 2023 05:15:44 +0000 (14:15 +0900)
Previously, we'd forward org.freedesktop.DBus.Local.Disconnected like
any other message to the other side. But that's not OK, as messages in
the org.freedesktop.DBus.Local.* namespace are supposed to never touch
the wire, and are synthetic messages that the library uses to
communicate with the app, but never with other apps.

dbus-daemon never cared, but dbus-broker complains about this, hence
clean this up.

See: #28514

src/stdio-bridge/stdio-bridge.c

index 48c29a67b4cdf9ffea6a404c5b19a358f54c7b65..ce2bd5f86f7db645bf0922b03bdc318363b0a7de 100644 (file)
@@ -182,10 +182,14 @@ static int run(int argc, char *argv[]) {
                 assert_cc(sizeof(usec_t) == sizeof(uint64_t));
 
                 r = sd_bus_process(a, &m);
+                if (ERRNO_IS_NEG_DISCONNECT(r)) /* Treat 'connection reset by peer' as clean exit condition */
+                        break;
                 if (r < 0)
                         return log_error_errno(r, "Failed to process bus a: %m");
-
                 if (m) {
+                        if (sd_bus_message_is_signal(m, "org.freedesktop.DBus.Local", "Disconnected"))
+                                break;
+
                         r = sd_bus_send(b, m, NULL);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to send message: %m");
@@ -195,13 +199,14 @@ static int run(int argc, char *argv[]) {
                         continue;
 
                 r = sd_bus_process(b, &m);
-                if (ERRNO_IS_NEG_DISCONNECT(r))
-                        /* Treat 'connection reset by peer' as clean exit condition */
-                        return 0;
+                if (ERRNO_IS_NEG_DISCONNECT(r)) /* Treat 'connection reset by peer' as clean exit condition */
+                        break;
                 if (r < 0)
                         return log_error_errno(r, "Failed to process bus: %m");
-
                 if (m) {
+                        if (sd_bus_message_is_signal(m, "org.freedesktop.DBus.Local", "Disconnected"))
+                                break;
+
                         r = sd_bus_send(a, m, NULL);
                         if (r < 0)
                                 return log_error_errno(r, "Failed to send message: %m");