From: Mike Yuan Date: Mon, 18 Nov 2024 17:57:53 +0000 (+0100) Subject: basic/user-util: modernize getgroups_alloc() a bit X-Git-Tag: v258-rc1~1918^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f0e8db76ca0eea5b039df8365bef691a343bc41f;p=thirdparty%2Fsystemd.git basic/user-util: modernize getgroups_alloc() a bit - Make sure ret is initialized if we return >= 0 - Reduce variable scope --- diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 80c34b311b8..e050bd4e7b2 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -529,20 +529,24 @@ int merge_gid_lists(const gid_t *list1, size_t size1, const gid_t *list2, size_t return (int)nresult; } -int getgroups_alloc(gid_t** gids) { - gid_t *allocated; - _cleanup_free_ gid_t *p = NULL; +int getgroups_alloc(gid_t **ret) { int ngroups = 8; - unsigned attempt = 0; - allocated = new(gid_t, ngroups); - if (!allocated) - return -ENOMEM; - p = allocated; + assert(ret); + + for (unsigned attempt = 0;;) { + _cleanup_free_ gid_t *p = NULL; + + p = new(gid_t, ngroups); + if (!p) + return -ENOMEM; - for (;;) { ngroups = getgroups(ngroups, p); - if (ngroups >= 0) + if (ngroups > 0) { + *ret = TAKE_PTR(p); + return ngroups; + } + if (ngroups == 0) break; if (errno != EINVAL) return -errno; @@ -557,17 +561,11 @@ int getgroups_alloc(gid_t** gids) { if (ngroups < 0) return -errno; if (ngroups == 0) - return false; - - free(allocated); - - p = allocated = new(gid_t, ngroups); - if (!allocated) - return -ENOMEM; + break; } - *gids = TAKE_PTR(p); - return ngroups; + *ret = NULL; + return 0; } int get_home_dir(char **ret) { diff --git a/src/basic/user-util.h b/src/basic/user-util.h index 6f221ebfb0b..653f14254af 100644 --- a/src/basic/user-util.h +++ b/src/basic/user-util.h @@ -64,7 +64,7 @@ int in_gid(gid_t gid); int in_group(const char *name); int merge_gid_lists(const gid_t *list1, size_t size1, const gid_t *list2, size_t size2, gid_t **result); -int getgroups_alloc(gid_t** gids); +int getgroups_alloc(gid_t **ret); int get_home_dir(char **ret); int get_shell(char **ret); diff --git a/src/test/test-user-util.c b/src/test/test-user-util.c index af06161bad3..bf8dd16d5ba 100644 --- a/src/test/test-user-util.c +++ b/src/test/test-user-util.c @@ -444,9 +444,8 @@ TEST(gid_lists_ops) { assert_se(nresult >= 0); assert_se(memcmp_nn(result2, ELEMENTSOF(result2), res4, nresult) == 0); - nresult = getgroups_alloc(&gids); - assert_se(nresult >= 0 || nresult == -EINVAL || nresult == -ENOMEM); - assert_se(gids); + ASSERT_OK(nresult = getgroups_alloc(&gids)); + assert_se(gids || nresult == 0); } TEST(parse_uid_range) {