diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-12-17 00:00:57 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-12-17 00:00:57 +0000 |
commit | d9961b6a4ff8282a1700aa176c1c3f66b63f4bc6 (patch) | |
tree | 440e6eeb86b762678e3100675950396115179993 /elf/tst-execstack.c | |
parent | be8c1500c7ce61b478cdc827705054c054386258 (diff) | |
download | glibc-d9961b6a4ff8282a1700aa176c1c3f66b63f4bc6.tar.gz |
* elf/tst-execstack.c (do_test): Don't fail if SELinux forbids
executable stacks.
Diffstat (limited to 'elf/tst-execstack.c')
-rw-r--r-- | elf/tst-execstack.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/elf/tst-execstack.c b/elf/tst-execstack.c index 4b06615451..a835e4c0d6 100644 --- a/elf/tst-execstack.c +++ b/elf/tst-execstack.c @@ -2,6 +2,7 @@ on load of a DSO that requires executable stacks. */ #include <dlfcn.h> +#include <stdbool.h> #include <stdio.h> #include <string.h> #include <unistd.h> @@ -45,9 +46,43 @@ waiter_thread (void *arg) } #endif + +static bool allow_execstack = true; + + static int do_test (void) { + /* Check whether SELinux is enabled and disallows executable stacks. */ + FILE *fp = fopen ("/selinux/enforce", "r"); + if (fp != NULL) + { + char *line = NULL; + size_t linelen = 0; + + bool enabled = false; + ssize_t n = getline (&line, &linelen, fp); + if (n > 0 && line[0] != '0') + enabled = true; + + fclose (fp); + + if (enabled) + { + fp = fopen ("/selinux/booleans/allow_execstack", "r"); + if (fp != NULL) + { + n = getline (&line, &linelen, fp); + if (n > 0 && line[0] == '0') + allow_execstack = false; + } + + fclose (fp); + } + } + + printf ("executable stacks %sallowed\n", allow_execstack ? "" : "not "); + static void *f; /* Address of this is used in other threads. */ #if USE_PTHREADS @@ -77,7 +112,7 @@ do_test (void) if (h == NULL) { printf ("cannot load: %s\n", dlerror ()); - return 1; + return allow_execstack; } f = dlsym (h, "tryme"); @@ -113,10 +148,10 @@ do_test (void) Let them run to test it. */ pthread_barrier_wait (&go_barrier); - pthread_exit (0); + pthread_exit (! allow_execstack); #endif - return 0; + return ! allow_execstack; } static void |