diff options
author | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2017-02-04 12:02:37 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2017-02-04 12:02:37 +0530 |
commit | 53aa04a86c10f49b7481e73d2ca045ecd6ed2df7 (patch) | |
tree | c3304cca37aebc39c9293ff47e79d65fe62aebab /elf/tst-env-setuid.c | |
parent | d675eaf7d99096a952c1d140abfed82c939fb259 (diff) | |
download | glibc-53aa04a86c10f49b7481e73d2ca045ecd6ed2df7.tar.gz glibc-53aa04a86c10f49b7481e73d2ca045ecd6ed2df7.tar.xz glibc-53aa04a86c10f49b7481e73d2ca045ecd6ed2df7.zip |
tunables: Fail tests correctly when setgid does not work
The child process of the tst-env-setuid process was failing correctly with EXIT_UNSUPPORTED but the parent did not carry that status forward and failed instead. This patch fixes this so that tests on nosuid /tmp fails gracefully with UNSUPPORTED. Tested by making my tmpfs nosuid. * elf/tst-env-setuid.c (do_execve): Return EXIT_UNSUPPORTED in parent if child exited in that manner. Print WEXITSTATUS instead of the raw status. (do_test_prep): Rename to do_test. (do_test): Return the result of run_executable_sgid. (TEST_FUNCTION_ARGV): Adjust.
Diffstat (limited to 'elf/tst-env-setuid.c')
-rw-r--r-- | elf/tst-env-setuid.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c index 85d423d799..6ec3fa5874 100644 --- a/elf/tst-env-setuid.c +++ b/elf/tst-env-setuid.c @@ -87,10 +87,13 @@ do_execve (char **args) return 1; } + if (WEXITSTATUS (status) == EXIT_UNSUPPORTED) + return EXIT_UNSUPPORTED; + if (!WIFEXITED (status) || WEXITSTATUS (status) != CHILD_STATUS) { printf ("Unexpected exit status %d from child process\n", - status); + WEXITSTATUS (status)); return 1; } return 0; @@ -235,7 +238,7 @@ test_parent (void) #endif static int -do_test_prep (int argc, char **argv) +do_test (int argc, char **argv) { /* Setgid child process. */ if (argc == 2 && strcmp (argv[1], SETGID_CHILD) == 0) @@ -270,13 +273,12 @@ do_test_prep (int argc, char **argv) exit (0); } - if (run_executable_sgid (target) == 0) - exit (0); + return run_executable_sgid (target); } /* Something went wrong and our argv was corrupted. */ _exit (1); } -#define TEST_FUNCTION_ARGV do_test_prep +#define TEST_FUNCTION_ARGV do_test #include <support/test-driver.c> |