1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-03-13 12:58:20 +03:00

stdio-bridge: properly handle org.freedesktop.DBus.Local.Disconnected signal

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
(cherry picked from commit 0321248b79d14ceddd36140b327332f145ae68e7)
(cherry picked from commit 0dbb4ff4ce3f440917d6415b059d48c11f3fc09a)
This commit is contained in:
Lennart Poettering 2023-11-28 23:29:50 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent 20a952828c
commit 4d2c65ed11

View File

@ -183,10 +183,16 @@ static int run(int argc, char *argv[]) {
assert_cc(sizeof(usec_t) == sizeof(uint64_t));
r = sd_bus_process(a, &m);
if (r < 0)
return log_error_errno(r, "Failed to process bus a: %m");
if (r < 0) {
if (ERRNO_IS_DISCONNECT(r)) /* Treat 'connection reset by peer' as clean exit condition */
break;
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");
@ -199,12 +205,14 @@ static int run(int argc, char *argv[]) {
if (r < 0) {
/* treat 'connection reset by peer' as clean exit condition */
if (ERRNO_IS_DISCONNECT(r))
return 0;
break;
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");