From 3f444e94f5a7ccc8d4f16a331858b0a4e717b773 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 20 Feb 2023 12:25:44 +0100 Subject: [PATCH] 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. --- src/basic/cap-list.c | 25 +++++++++++++------------ src/basic/cap-list.h | 2 +- src/test/test-cap-list.c | 12 ++++++------ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/basic/cap-list.c b/src/basic/cap-list.c index b764d23cca..0af37b94ee 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 42d29c4718..888e9223e7 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 31c61b8d8d..cc5f3a0c35 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); } -- 2.25.1