1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-09 12:58:26 +03:00

basic/user-util: modernize getgroups_alloc() a bit

- Make sure ret is initialized if we return >= 0
- Reduce variable scope
This commit is contained in:
Mike Yuan 2024-11-18 18:57:53 +01:00
parent 8112df6bef
commit f0e8db76ca
No known key found for this signature in database
GPG Key ID: 417471C0A40F58B3
3 changed files with 20 additions and 23 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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) {