From: Mike Gerow Date: Wed, 17 Apr 2019 09:45:34 +0000 (+0200) Subject: stdlib/tst-secure-getenv: handle >64 groups X-Git-Tag: glibc-2.30~217 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fglibc.git;a=commitdiff_plain;h=bae8cf0e930d82133e96c4e2547548ed53938de1 stdlib/tst-secure-getenv: handle >64 groups This test would fail unnecessarily if the user running it had more than 64 groups since getgroups returns EINVAL if the size provided is less than the number of supplementary group IDs. Instead dynamically determine the number of supplementary groups the user has. --- diff --git a/ChangeLog b/ChangeLog index aaa413df679..a23bdf29bda 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-04-17 Mike Gerow + + * stdlib/tst-secure-getenv.c (choose_gid): Remove 64 supplemental + groups limit. + 2019-04-11 Florian Weimer * resolv/nss_dns/dns-network.c (getanswer_r): Do not replace root diff --git a/stdlib/tst-secure-getenv.c b/stdlib/tst-secure-getenv.c index 74580b889ab..94de199530c 100644 --- a/stdlib/tst-secure-getenv.c +++ b/stdlib/tst-secure-getenv.c @@ -41,8 +41,14 @@ static char MAGIC_ARGUMENT[] = "run-actual-test"; static gid_t choose_gid (void) { - const int count = 64; - gid_t groups[count]; + int count = getgroups (0, NULL); + if (count < 0) + { + printf ("getgroups: %m\n"); + exit (1); + } + gid_t *groups; + groups = xcalloc (count, sizeof (*groups)); int ret = getgroups (count, groups); if (ret < 0) { @@ -50,12 +56,17 @@ choose_gid (void) exit (1); } gid_t current = getgid (); + gid_t not_current = 0; for (int i = 0; i < ret; ++i) { if (groups[i] != current) - return groups[i]; + { + not_current = groups[i]; + break; + } } - return 0; + free (groups); + return not_current; }