1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-10 05:03:06 +03:00

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.
This commit is contained in:
Siddhesh Poyarekar
2017-02-04 12:02:37 +05:30
parent d675eaf7d9
commit 53aa04a86c
2 changed files with 16 additions and 5 deletions

View File

@@ -1,3 +1,12 @@
2017-02-04 Siddhesh Poyarekar <siddhesh@sourceware.org>
* 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.
2017-02-03 Alexandre Oliva <aoliva@redhat.com> 2017-02-03 Alexandre Oliva <aoliva@redhat.com>
Florian Weimer <fweimer@redhat.com> Florian Weimer <fweimer@redhat.com>
Carlos O'Donell <carlos@redhat.com> Carlos O'Donell <carlos@redhat.com>

View File

@@ -87,10 +87,13 @@ do_execve (char **args)
return 1; return 1;
} }
if (WEXITSTATUS (status) == EXIT_UNSUPPORTED)
return EXIT_UNSUPPORTED;
if (!WIFEXITED (status) || WEXITSTATUS (status) != CHILD_STATUS) if (!WIFEXITED (status) || WEXITSTATUS (status) != CHILD_STATUS)
{ {
printf ("Unexpected exit status %d from child process\n", printf ("Unexpected exit status %d from child process\n",
status); WEXITSTATUS (status));
return 1; return 1;
} }
return 0; return 0;
@@ -235,7 +238,7 @@ test_parent (void)
#endif #endif
static int static int
do_test_prep (int argc, char **argv) do_test (int argc, char **argv)
{ {
/* Setgid child process. */ /* Setgid child process. */
if (argc == 2 && strcmp (argv[1], SETGID_CHILD) == 0) if (argc == 2 && strcmp (argv[1], SETGID_CHILD) == 0)
@@ -270,13 +273,12 @@ do_test_prep (int argc, char **argv)
exit (0); exit (0);
} }
if (run_executable_sgid (target) == 0) return run_executable_sgid (target);
exit (0);
} }
/* Something went wrong and our argv was corrupted. */ /* Something went wrong and our argv was corrupted. */
_exit (1); _exit (1);
} }
#define TEST_FUNCTION_ARGV do_test_prep #define TEST_FUNCTION_ARGV do_test
#include <support/test-driver.c> #include <support/test-driver.c>