aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-07-18 23:14:40 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-08-03 23:59:55 +0200
commitad4589e2d834c80a042a8c354fb00cf33e06802c (patch)
treee0666d401943a47994161edc9d0007f96dd8d6c6
parente1f03adef9f52c5c93d4e75295de201cbdc1b793 (diff)
downloadglibc-ad4589e2d834c80a042a8c354fb00cf33e06802c.zip
glibc-ad4589e2d834c80a042a8c354fb00cf33e06802c.tar.gz
glibc-ad4589e2d834c80a042a8c354fb00cf33e06802c.tar.bz2
hurd: support: Fix running SGID tests
Secure mode is enabled only if SGID actually provides a new privilege, so we have to drop it before gaining it again. Fixes commit 3a3fb2ed83f79100c116c824454095ecfb335ad7 ("Fix error reporting (false negatives) in SGID tests")
-rw-r--r--support/support_capture_subprocess.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c
index b4e4bf9..c89e65b 100644
--- a/support/support_capture_subprocess.c
+++ b/support/support_capture_subprocess.c
@@ -133,6 +133,27 @@ copy_and_spawn_sgid (const char *child_id, gid_t gid)
if (chmod (execname, 02750) != 0)
FAIL_UNSUPPORTED ("cannot make \"%s\" SGID: %m ", execname);
+ /* Now we can drop the privilege of that group. */
+ const int count = 64;
+ gid_t groups[count];
+ int ngroups = getgroups(count, groups);
+
+ if (ngroups < 0)
+ FAIL_UNSUPPORTED ("Could not get group list again for user %jd\n",
+ (intmax_t) getuid ());
+
+ int n = 0;
+ for (int i = 0; i < ngroups; i++)
+ {
+ if (groups[i] != gid)
+ {
+ if (n != i)
+ groups[n] = groups[i];
+ n++;
+ }
+ }
+ setgroups (n, groups);
+
/* We have the binary, now spawn the subprocess. Avoid using
support_subprogram because we only want the program exit status, not the
contents. */