From: Lennart Poettering Date: Mon, 20 Feb 2023 11:25:44 +0000 (+0100) Subject: cap-list: modernize capability_set_from_string() a bit X-Git-Tag: v254-rc1~1228^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3f444e94f5a7ccc8d4f16a331858b0a4e717b773;p=thirdparty%2Fsystemd.git cap-list: modernize capability_set_from_string() a bit Make return parameter optional. And return whether there were any caps we didn't recognize via 0/1 return value. --- diff --git a/src/basic/cap-list.c b/src/basic/cap-list.c index b764d23cca1..0af37b94ee9 100644 --- a/src/basic/cap-list.c +++ b/src/basic/cap-list.c @@ -92,29 +92,30 @@ int capability_set_to_string(uint64_t set, char **ret) { return 0; } -int capability_set_from_string(const char *s, uint64_t *set) { +int capability_set_from_string(const char *s, uint64_t *ret) { uint64_t val = 0; - - assert(set); + bool good = true; for (const char *p = s;;) { _cleanup_free_ char *word = NULL; int r; - r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE); - if (r == -ENOMEM) + r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE|EXTRACT_RELAX); + if (r < 0) return r; - if (r <= 0) + if (r == 0) break; r = capability_from_name(word); - if (r < 0) - continue; - - val |= ((uint64_t) UINT64_C(1)) << (uint64_t) r; + if (r < 0) { + log_debug_errno(r, "Failed to parse capability '%s', ignoring: %m", word); + good = false; + } else + val |= UINT64_C(1) << r; } - *set = val; + if (ret) + *ret = val; - return 0; + return good; } diff --git a/src/basic/cap-list.h b/src/basic/cap-list.h index 42d29c4718e..888e9223e7b 100644 --- a/src/basic/cap-list.h +++ b/src/basic/cap-list.h @@ -8,4 +8,4 @@ int capability_from_name(const char *name); int capability_list_length(void); int capability_set_to_string(uint64_t set, char **ret); -int capability_set_from_string(const char *s, uint64_t *set); +int capability_set_from_string(const char *s, uint64_t *ret); diff --git a/src/test/test-cap-list.c b/src/test/test-cap-list.c index 31c61b8d8d1..cc5f3a0c35d 100644 --- a/src/test/test-cap-list.c +++ b/src/test/test-cap-list.c @@ -60,7 +60,7 @@ static void test_capability_set_one(uint64_t c, const char *t) { assert_se(capability_set_to_string(c, &t1) == 0); assert_se(streq(t1, t)); - assert_se(capability_set_from_string(t1, &c1) == 0); + assert_se(capability_set_from_string(t1, &c1) > 0); assert_se(c1 == c_masked); free(t1); @@ -73,19 +73,19 @@ static void test_capability_set_one(uint64_t c, const char *t) { TEST(capability_set_from_string) { uint64_t c; - assert_se(capability_set_from_string(NULL, &c) == 0); + assert_se(capability_set_from_string(NULL, &c) > 0); assert_se(c == 0); - assert_se(capability_set_from_string("", &c) == 0); + assert_se(capability_set_from_string("", &c) > 0); assert_se(c == 0); - assert_se(capability_set_from_string("0", &c) == 0); + assert_se(capability_set_from_string("0", &c) > 0); assert_se(c == UINT64_C(1)); - assert_se(capability_set_from_string("1", &c) == 0); + assert_se(capability_set_from_string("1", &c) > 0); assert_se(c == UINT64_C(1) << 1); - assert_se(capability_set_from_string("0 1 2 3", &c) == 0); + assert_se(capability_set_from_string("0 1 2 3", &c) > 0); assert_se(c == (UINT64_C(1) << 4) - 1); }