tunables: Fail tests correctly when setgid does not work
authorSiddhesh Poyarekar <siddhesh@sourceware.org>
Sat, 4 Feb 2017 06:32:37 +0000 (12:02 +0530)
committerSiddhesh Poyarekar <siddhesh@sourceware.org>
Sat, 4 Feb 2017 06:32:37 +0000 (12:02 +0530)
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.

ChangeLog
elf/tst-env-setuid.c

index 9ed7ff6..767e22a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
            Florian Weimer  <fweimer@redhat.com>
            Carlos O'Donell  <carlos@redhat.com>
 2017-02-03  Alexandre Oliva  <aoliva@redhat.com>
            Florian Weimer  <fweimer@redhat.com>
            Carlos O'Donell  <carlos@redhat.com>
index 85d423d..6ec3fa5 100644 (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)
     {
       printf ("Unexpected exit status %d from child process\n",
   if (!WIFEXITED (status) || WEXITSTATUS (status) != CHILD_STATUS)
     {
       printf ("Unexpected exit status %d from child process\n",
-             status);
+             WEXITSTATUS (status));
       return 1;
     }
   return 0;
       return 1;
     }
   return 0;
@@ -235,7 +238,7 @@ test_parent (void)
 #endif
 
 static int
 #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)
 {
   /* 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);
        }
 
          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);
 }
 
     }
 
   /* 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>
 #include <support/test-driver.c>