155 lines
4.2 KiB
Diff
155 lines
4.2 KiB
Diff
|
commit a7b8e8ec9b21c7c6d4ec0ba2229abd63dc3a00b2
|
||
|
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||
|
Date: Tue Mar 16 12:37:54 2021 +0530
|
||
|
|
||
|
Enhance setuid-tunables test
|
||
|
|
||
|
Instead of passing GLIBC_TUNABLES via the environment, pass the
|
||
|
environment variable from parent to child. This allows us to test
|
||
|
multiple variables to ensure better coverage.
|
||
|
|
||
|
The test list currently only includes the case that's already being
|
||
|
tested. More tests will be added later.
|
||
|
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||
|
|
||
|
(cherry picked from commit 061fe3f8add46a89b7453e87eabb9c4695005ced)
|
||
|
|
||
|
diff --git a/elf/Makefile b/elf/Makefile
|
||
|
index 4b92f8b3054b556e..28e18aea5d412222 100644
|
||
|
--- a/elf/Makefile
|
||
|
+++ b/elf/Makefile
|
||
|
@@ -1658,8 +1658,6 @@ $(objpfx)tst-nodelete-dlclose.out: $(objpfx)tst-nodelete-dlclose-dso.so \
|
||
|
|
||
|
tst-env-setuid-ENV = MALLOC_CHECK_=2 MALLOC_MMAP_THRESHOLD_=4096 \
|
||
|
LD_HWCAP_MASK=0x1
|
||
|
-tst-env-setuid-tunables-ENV = \
|
||
|
- GLIBC_TUNABLES=glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096
|
||
|
|
||
|
$(objpfx)tst-debug1: $(libdl)
|
||
|
$(objpfx)tst-debug1.out: $(objpfx)tst-debug1mod1.so
|
||
|
diff --git a/elf/tst-env-setuid-tunables.c b/elf/tst-env-setuid-tunables.c
|
||
|
index 50bef8683df0e9c1..3d523875b1e07a74 100644
|
||
|
--- a/elf/tst-env-setuid-tunables.c
|
||
|
+++ b/elf/tst-env-setuid-tunables.c
|
||
|
@@ -25,35 +25,50 @@
|
||
|
#include "config.h"
|
||
|
#undef _LIBC
|
||
|
|
||
|
-#define test_parent test_parent_tunables
|
||
|
-#define test_child test_child_tunables
|
||
|
-
|
||
|
-static int test_child_tunables (void);
|
||
|
-static int test_parent_tunables (void);
|
||
|
-
|
||
|
-#include "tst-env-setuid.c"
|
||
|
+#include <errno.h>
|
||
|
+#include <fcntl.h>
|
||
|
+#include <stdlib.h>
|
||
|
+#include <stdint.h>
|
||
|
+#include <stdio.h>
|
||
|
+#include <string.h>
|
||
|
+#include <sys/stat.h>
|
||
|
+#include <sys/wait.h>
|
||
|
+#include <unistd.h>
|
||
|
+#include <intprops.h>
|
||
|
+#include <array_length.h>
|
||
|
+
|
||
|
+#include <support/check.h>
|
||
|
+#include <support/support.h>
|
||
|
+#include <support/test-driver.h>
|
||
|
+#include <support/capture_subprocess.h>
|
||
|
+
|
||
|
+const char *teststrings[] =
|
||
|
+{
|
||
|
+ "glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096",
|
||
|
+};
|
||
|
|
||
|
-#define CHILD_VALSTRING_VALUE "glibc.malloc.mmap_threshold=4096"
|
||
|
-#define PARENT_VALSTRING_VALUE \
|
||
|
- "glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096"
|
||
|
+const char *resultstrings[] =
|
||
|
+{
|
||
|
+ "glibc.malloc.mmap_threshold=4096",
|
||
|
+};
|
||
|
|
||
|
static int
|
||
|
-test_child_tunables (void)
|
||
|
+test_child (int off)
|
||
|
{
|
||
|
const char *val = getenv ("GLIBC_TUNABLES");
|
||
|
|
||
|
#if HAVE_TUNABLES
|
||
|
- if (val != NULL && strcmp (val, CHILD_VALSTRING_VALUE) == 0)
|
||
|
+ if (val != NULL && strcmp (val, resultstrings[off]) == 0)
|
||
|
return 0;
|
||
|
|
||
|
if (val != NULL)
|
||
|
- printf ("Unexpected GLIBC_TUNABLES VALUE %s\n", val);
|
||
|
+ printf ("[%d] Unexpected GLIBC_TUNABLES VALUE %s\n", off, val);
|
||
|
|
||
|
return 1;
|
||
|
#else
|
||
|
if (val != NULL)
|
||
|
{
|
||
|
- printf ("GLIBC_TUNABLES not cleared\n");
|
||
|
+ printf ("[%d] GLIBC_TUNABLES not cleared\n", off);
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
@@ -61,15 +76,48 @@ test_child_tunables (void)
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
-test_parent_tunables (void)
|
||
|
+do_test (int argc, char **argv)
|
||
|
{
|
||
|
- const char *val = getenv ("GLIBC_TUNABLES");
|
||
|
+ /* Setgid child process. */
|
||
|
+ if (argc == 2)
|
||
|
+ {
|
||
|
+ if (getgid () == getegid ())
|
||
|
+ /* This can happen if the file system is mounted nosuid. */
|
||
|
+ FAIL_UNSUPPORTED ("SGID failed: GID and EGID match (%jd)\n",
|
||
|
+ (intmax_t) getgid ());
|
||
|
|
||
|
- if (val != NULL && strcmp (val, PARENT_VALSTRING_VALUE) == 0)
|
||
|
- return 0;
|
||
|
+ int ret = test_child (atoi (argv[1]));
|
||
|
|
||
|
- if (val != NULL)
|
||
|
- printf ("Unexpected GLIBC_TUNABLES VALUE %s\n", val);
|
||
|
+ if (ret != 0)
|
||
|
+ exit (1);
|
||
|
|
||
|
- return 1;
|
||
|
+ exit (EXIT_SUCCESS);
|
||
|
+ }
|
||
|
+ else
|
||
|
+ {
|
||
|
+ int ret = 0;
|
||
|
+
|
||
|
+ /* Spawn tests. */
|
||
|
+ for (int i = 0; i < array_length (teststrings); i++)
|
||
|
+ {
|
||
|
+ char buf[INT_BUFSIZE_BOUND (int)];
|
||
|
+
|
||
|
+ printf ("Spawned test for %s (%d)\n", teststrings[i], i);
|
||
|
+ snprintf (buf, sizeof (buf), "%d\n", i);
|
||
|
+ if (setenv ("GLIBC_TUNABLES", teststrings[i], 1) != 0)
|
||
|
+ exit (1);
|
||
|
+
|
||
|
+ int status = support_capture_subprogram_self_sgid (buf);
|
||
|
+
|
||
|
+ /* Bail out early if unsupported. */
|
||
|
+ if (WEXITSTATUS (status) == EXIT_UNSUPPORTED)
|
||
|
+ return EXIT_UNSUPPORTED;
|
||
|
+
|
||
|
+ ret |= status;
|
||
|
+ }
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
}
|
||
|
+
|
||
|
+#define TEST_FUNCTION_ARGV do_test
|
||
|
+#include <support/test-driver.c>
|