diff --git a/src/basic/cap-list.c b/src/basic/cap-list.c index 124641f940..2e9b2d9a55 100644 --- a/src/basic/cap-list.c +++ b/src/basic/cap-list.c @@ -86,15 +86,17 @@ int capability_set_to_string_alloc(uint64_t set, char **s) { add = strlen(p); - if (!GREEDY_REALLOC0(str, allocated, n + add + 2)) + if (!GREEDY_REALLOC(str, allocated, n + add + 2)) return -ENOMEM; strcpy(mempcpy(str + n, p, add), " "); n += add + 1; } - if (n != 0) - str[n - 1] = '\0'; + if (!GREEDY_REALLOC(str, allocated, n + 1)) + return -ENOMEM; + + str[n > 0 ? n - 1 : 0] = '\0'; /* truncate the last space, if it's there */ *s = str; str = NULL; diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c index 48752c5fea..a9a763c1ca 100644 --- a/src/shared/bus-util.c +++ b/src/shared/bus-util.c @@ -809,7 +809,17 @@ int bus_print_property(const char *name, sd_bus_message *property, bool value, b if (strstr(name, "UMask") || strstr(name, "Mode")) print_property(name, "%04o", u); - else + else if (streq(name, "UID")) { + if (u == UID_INVALID) + print_property(name, "%s", "[not set]"); + else + print_property(name, "%"PRIu32, u); + } else if (streq(name, "GID")) { + if (u == GID_INVALID) + print_property(name, "%s", "[not set]"); + else + print_property(name, "%"PRIu32, u); + } else print_property(name, "%"PRIu32, u); return 1; diff --git a/src/test/test-cap-list.c b/src/test/test-cap-list.c index 4132ec56fd..c1af277f34 100644 --- a/src/test/test-cap-list.c +++ b/src/test/test-cap-list.c @@ -24,6 +24,7 @@ #include "capability-util.h" #include "fileio.h" #include "parse-util.h" +#include "string-util.h" #include "util.h" /* verify the capability parser */ @@ -102,10 +103,24 @@ static void test_last_cap_probe(void) { assert_se(p == cap_last_cap()); } +static void test_capability_set_to_string_alloc(void) { + _cleanup_free_ char *t1 = NULL, *t2 = NULL, *t3 = NULL; + + assert_se(capability_set_to_string_alloc(0u, &t1) == 0); + assert_se(streq(t1, "")); + + assert_se(capability_set_to_string_alloc(1u<