From patchwork Thu Feb 2 18:31:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 19097 Received: (qmail 13002 invoked by alias); 2 Feb 2017 18:31:49 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 12990 invoked by uid 89); 2 Feb 2017 18:31:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.5 required=5.0 tests=AWL, BAYES_50, RCVD_IN_DNSWL_NONE, SPF_NEUTRAL autolearn=no version=3.3.2 spammy=corrupted, tst-env-setuid, sk:EXIT_UN, CHILD_STATUS X-HELO: homiemail-a45.g.dreamhost.com From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Cc: carlos@redhat.com Subject: [PATCH] tunables: Fail tests correctly when setgid does not work Date: Fri, 3 Feb 2017 00:01:35 +0530 Message-Id: <1486060295-4624-1-git-send-email-siddhesh@sourceware.org> 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