From a845e53a48e7ab0088b39dd0d4730def7d2fc122 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 Nov 2018 17:20:21 +0100 Subject: [PATCH 1/3] sd-bus: optimize sd_bus_get_name_creds() If the caller asks for a unique name, but the input name is already unique we can shortcut things and just use that, as long as we make at least one bus call to validate it. --- src/libsystemd/sd-bus/bus-control.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index 2787e8505b..76a5be8e5d 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -430,7 +430,7 @@ _public_ int sd_bus_get_name_creds( _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply_unique = NULL, *reply = NULL; _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *c = NULL; - const char *unique = NULL; + const char *unique; pid_t pid = 0; int r; @@ -459,9 +459,12 @@ _public_ int sd_bus_get_name_creds( if (!BUS_IS_OPEN(bus->state)) return -ENOTCONN; - /* Only query the owner if the caller wants to know it or if - * the caller just wants to check whether a name exists */ - if ((mask & SD_BUS_CREDS_UNIQUE_NAME) || mask == 0) { + /* If the name is unique anyway, we can use it directly */ + unique = name[0] == ':' ? name : NULL; + + /* Only query the owner if the caller wants to know it and the name is not unique anyway, or if the caller just + * wants to check whether a name exists */ + if ((FLAGS_SET(mask, SD_BUS_CREDS_UNIQUE_NAME) && !unique) || mask == 0) { r = sd_bus_call_method( bus, "org.freedesktop.DBus", @@ -483,6 +486,7 @@ _public_ int sd_bus_get_name_creds( if (mask != 0) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; bool need_pid, need_uid, need_selinux, need_separate_calls; + c = bus_creds_new(); if (!c) return -ENOMEM; From 84a35687179142afd627da2836e62e898b4f3ac8 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 Nov 2018 17:21:10 +0100 Subject: [PATCH 2/3] sd-bus: use gcc ?: shortcut --- src/libsystemd/sd-bus/bus-control.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index 76a5be8e5d..6507ce95f7 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -665,7 +665,7 @@ _public_ int sd_bus_get_name_creds( NULL, &reply, "s", - unique ? unique : name); + unique ?: name); if (r < 0) return r; @@ -692,7 +692,7 @@ _public_ int sd_bus_get_name_creds( &error, &reply, "s", - unique ? unique : name); + unique ?: name); if (r < 0) { if (!sd_bus_error_has_name(&error, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown")) return r; From 1a64f8c63d1385be87e9f2bb66e870b943548b34 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 Nov 2018 17:21:27 +0100 Subject: [PATCH 3/3] sd-bus: use memdup_suffix0() where appropriate --- src/libsystemd/sd-bus/bus-control.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index 6507ce95f7..7775d2b376 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -703,7 +703,7 @@ _public_ int sd_bus_get_name_creds( if (r < 0) return r; - c->label = strndup(p, sz); + c->label = memdup_suffix0(p, sz); if (!c->label) return -ENOMEM;