From 22185cb71e83dc563a9249e460417ea979755e13 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 16 Nov 2023 04:46:24 +0900 Subject: [PATCH 1/4] sd-bus: insert missing space --- src/libsystemd/sd-bus/bus-error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 7a2303350c..77b2e1a0fd 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -599,7 +599,7 @@ const char* _bus_error_message(const sd_bus_error *e, int error, char buf[static static bool map_ok(const sd_bus_error_map *map) { for (; map->code != BUS_ERROR_MAP_END_MARKER; map++) - if (!map->name || map->code <=0) + if (!map->name || map->code <= 0) return false; return true; } From 02dd646b16c2c1339197f69e96d2395c7d5357a8 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 16 Nov 2023 03:37:24 +0900 Subject: [PATCH 2/4] sd-bus: drop SD_BUS_CREDS_AUGMENT flag On checking if the message has enough credentials, the special flag needs to be dropped. Fixes a bug introduced by 705a415f684f8e9ee19983e5859de00bbb1477cb. --- src/libsystemd/sd-bus/bus-convenience.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-convenience.c b/src/libsystemd/sd-bus/bus-convenience.c index 81892c3254..989e577de5 100644 --- a/src/libsystemd/sd-bus/bus-convenience.c +++ b/src/libsystemd/sd-bus/bus-convenience.c @@ -655,7 +655,7 @@ _public_ int sd_bus_query_sender_creds(sd_bus_message *call, uint64_t mask, sd_b c = sd_bus_message_get_creds(call); /* All data we need? */ - if (c && (mask & ~c->mask) == 0) { + if (c && (mask & ~SD_BUS_CREDS_AUGMENT & ~c->mask) == 0) { *ret = sd_bus_creds_ref(c); return 0; } From ce5a6d5307568671cec7c253e984ffc0eafa726b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 16 Nov 2023 04:37:02 +0900 Subject: [PATCH 3/4] test: several cleanups for test-bus-chat - use sd_bus_query_sender_creds() to retrieve credentials, - read credentials only when we get credentials, to avoid triggering assert_return(), - downgrade log level of expected failure, and update log message about unexpected success. Prompted by #30029. --- src/libsystemd/sd-bus/test-bus-chat.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-bus/test-bus-chat.c b/src/libsystemd/sd-bus/test-bus-chat.c index 4b457fd76b..da1340fe59 100644 --- a/src/libsystemd/sd-bus/test-bus-chat.c +++ b/src/libsystemd/sd-bus/test-bus-chat.c @@ -106,6 +106,7 @@ static int server(sd_bus *_bus) { while (!client1_gone || !client2_gone) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; + _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL; pid_t pid = 0; const char *label = NULL; @@ -122,8 +123,16 @@ static int server(sd_bus *_bus) { if (!m) continue; - (void) sd_bus_creds_get_pid(sd_bus_message_get_creds(m), &pid); - (void) sd_bus_creds_get_selinux_context(sd_bus_message_get_creds(m), &label); + r = sd_bus_query_sender_creds(m, SD_BUS_CREDS_AUGMENT | SD_BUS_CREDS_PID | SD_BUS_CREDS_SELINUX_CONTEXT, &creds); + if (r < 0) + log_debug_errno(r, "Failed to query sender credentials, ignoring: %m"); + else { + r = sd_bus_creds_get_pid(creds, &pid); + if (r < 0) + return log_error_errno(r, "Failed to get sender pid: %m"); + + (void) sd_bus_creds_get_selinux_context(creds, &label); + } log_info("Got message! member=%s pid="PID_FMT" label=%s", strna(sd_bus_message_get_member(m)), @@ -421,9 +430,12 @@ static void* client2(void *p) { r = sd_bus_call(bus, m, 200 * USEC_PER_MSEC, &error, &reply); if (r < 0) - log_info("Failed to issue method call: %s", bus_error_message(&error, r)); - else - log_info("Slow call succeed."); + log_debug("Failed to issue method call: %s", bus_error_message(&error, r)); + else { + log_error("Slow call unexpectedly succeed."); + r = -ENOANO; + goto finish; + } m = sd_bus_message_unref(m); From 69f1c33425f173bc7f8471d1075c916f83866c82 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 16 Nov 2023 09:14:38 +0900 Subject: [PATCH 4/4] test: sd_bus_process() may assign NULL even if it returns positive Let's not trigger assert_return() needlessly. Prompted by #30029. --- src/libsystemd/sd-bus/test-bus-peersockaddr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/test-bus-peersockaddr.c b/src/libsystemd/sd-bus/test-bus-peersockaddr.c index 4774ef6a4c..79556e8a85 100644 --- a/src/libsystemd/sd-bus/test-bus-peersockaddr.c +++ b/src/libsystemd/sd-bus/test-bus-peersockaddr.c @@ -65,7 +65,7 @@ static void *server(void *p) { continue; } - if (sd_bus_message_is_method_call(m, "foo.foo", "Foo") > 0) { + if (m && sd_bus_message_is_method_call(m, "foo.foo", "Foo") > 0) { assert_se(sd_bus_reply_method_return(m, "s", "bar") >= 0); break; }