prctl02.c revision fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716
1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 2d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. 3d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 4d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is free software; you can redistribute it and/or modify it 5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * under the terms of version 2 of the GNU General Public License as 6d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * published by the Free Software Foundation. 7d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 8d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is distributed in the hope that it would be useful, but 9d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * WITHOUT ANY WARRANTY; without even the implied warranty of 10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 11d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 12d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * You should have received a copy of the GNU General Public License along 13fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc., 14fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 16d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 17d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/********************************************************** 184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 19d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST IDENTIFIER : prctl02 204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 21d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * EXECUTED BY : anyone 224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 23d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST TITLE : Tests for error conditions 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 25d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST CASE TOTAL : 2 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 27d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * AUTHOR : Saji Kumar.V.R <saji.kumar@wipro.com> 284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * SIGNALS 30d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Uses SIGUSR1 to pause before test if option set. 31d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * (See the parse_opts(3) man page). 32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * DESCRIPTION 34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Verify that 35d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 1) prctl() fails with errno, EINVAL when an invalid value is given for 36d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * option 37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 2) prctl() fails with errno, EINVAL when option is PR_SET_PDEATHSIG 38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * & arg2 is not zero or a valid signal number 394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 40d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Setup: 41d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Setup signal handling. 42d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Pause for SIGUSR1 if option specified. 434bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 44d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test: 45d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Loop if the proper options are given. 46d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * fork a child 47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 48d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * CHILD: 49d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * call prctl() with proper arguments 50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * If call fails with expected errno, 51d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * exit with 0 52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * else 53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * exit with 1 54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * PARENT: 55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * wait() for child. 56d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * If child exits with exit value 0, 57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test passed 58d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * else 59d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Test Failed 602c28215423293e443469a07ae7011135d058b671Garrett Cooper * 61d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Cleanup: 62d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Print errno log and/or timing stats if options given 634bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 64d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * USAGE: <for command-line> 65d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * prctl02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p] 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * where, -c n : Run n copies concurrently. 67d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -e : Turn on errno logging. 68d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -h : Show help screen 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -f : Turn off functional testing 70d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -i n : Execute test n times. 71d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -I x : Execute test for x seconds. 72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -p : Pause for SIGUSR1 before starting 73d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -P x : Pause for x seconds between iterations. 74d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -t : Turn on syscall timing. 75d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 76d13d74bbf207c2d01598c6fef092a75b93b07c71vapier ****************************************************************/ 77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 78d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h> 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <signal.h> 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/prctl.h> 81d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/wait.h> 82d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 83d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "test.h" 84d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "usctest.h" 85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define OPTION_INVALID 999 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define INVALID_ARG 999 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 89d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void setup(void); 90d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void cleanup(void); 91d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 92fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "prctl02"; 9356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic int exp_enos[] = { EINVAL, EINVAL, 0 }; 94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct test_cases_t { 96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int option; 97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier unsigned long arg2; 98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int exp_errno; 99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} test_cases[] = { 10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak OPTION_INVALID, 0, EINVAL}, { 10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PR_SET_PDEATHSIG, INVALID_ARG, EINVAL} 103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier}; 104bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 105d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]); 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 108d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 11089af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc, i; 11189af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis char *msg; 112d13d74bbf207c2d01598c6fef092a75b93b07c71vapier pid_t child_pid; 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int status; 114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 115a9e49f17aa62b553a30a915114823302eadc54d3Garrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) 11660fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 118d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 121d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 122d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 124d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (i = 0; i < TST_TOTAL; ++i) { 125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 126ed06ca62aea8ff284a88e4848bceb274ce20e708mridge switch (child_pid = FORK_OR_VFORK()) { 127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case -1: 129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* fork() failed */ 130d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "fork() failed"); 131d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 132d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 133d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case 0: 134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Child */ 135d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 136d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST(prctl(test_cases[i].option, 137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier test_cases[i].arg2)); 138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((TEST_RETURN == -1) && (TEST_ERRNO == 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_cases 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao [i].exp_errno)) { 141d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TWARN | TTERRNO, 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "prctl() returned %ld", 145923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak TEST_RETURN); 146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier default: 150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Parent */ 151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((waitpid(child_pid, &status, 0)) < 0) { 152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "waitpid() failed"); 153d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((WIFEXITED(status)) && (WEXITSTATUS(status) 157354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao == 158354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_cases 159354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao [i].exp_errno)) { 160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "Test Passed"); 161d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "Test Failed"); 163d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_ERROR_LOG(WEXITSTATUS(status)); 165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 167d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 1682c28215423293e443469a07ae7011135d058b671Garrett Cooper } 169d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 170d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* cleanup and exit */ 171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 17353740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_exit(); 174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1752c28215423293e443469a07ae7011135d058b671Garrett Cooper} 176d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 177d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */ 17856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 179d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 180d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(FORK, DEF_HANDLER, cleanup); 182bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 183d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* set the expected errnos... */ 184d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_EXP_ENOS(exp_enos); 185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 186d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 187d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1882c28215423293e443469a07ae7011135d058b671Garrett Cooper} 189d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 190d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 191d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() - performs all ONE TIME cleanup for this test at 192d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * completion or premature exit. 193d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 195d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 196d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 197d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* 198d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print timing stats if that option was specified. 199d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print errno log if that option was specified. 200d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 201d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_CLEANUP; 202d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 203ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 204