[PATCH] tunables: Fail tests correctly when setgid does not work

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] tunables: Fail tests correctly when setgid does not work

Siddhesh Poyarekar-9
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.
---
 elf/tst-env-setuid.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c
index 85d423d..6ec3fa5 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>
--
2.7.4

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] tunables: Fail tests correctly when setgid does not work

Siddhesh Poyarekar-8
Ping, I'll commit this before I cut the release on Sunday if there are
no objections since I got Carlos also to test an initial version of the
patch last night.

Siddhesh

On Friday 03 February 2017 12:01 AM, Siddhesh Poyarekar wrote:

> 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.
> ---
>  elf/tst-env-setuid.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c
> index 85d423d..6ec3fa5 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>
>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] tunables: Fail tests correctly when setgid does not work

Carlos O'Donell-6
In reply to this post by Siddhesh Poyarekar-9
On Thu, Feb 2, 2017 at 1:31 PM, Siddhesh Poyarekar
<[hidden email]> wrote:

> 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 works as expected.

Both tests are now UNSUPPORTED on my system where /tmp is mounted as nosuid.

For this test to pass I need to use a TMPDIR which is not nosuid.

Cheers,
Carlos.