diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index 2787e8505ba..7775d2b3762 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; @@ -661,7 +665,7 @@ _public_ int sd_bus_get_name_creds( NULL, &reply, "s", - unique ? unique : name); + unique ?: name); if (r < 0) return r; @@ -688,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; @@ -699,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;