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 85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define OPTION_INVALID 999 86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define INVALID_ARG 999 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void setup(void); 89d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstatic void cleanup(void); 90d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 91fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "prctl02"; 92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 93d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct test_cases_t { 94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int option; 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier unsigned long arg2; 96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int exp_errno; 97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} test_cases[] = { 9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 9956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak OPTION_INVALID, 0, EINVAL}, { 10056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak PR_SET_PDEATHSIG, INVALID_ARG, EINVAL} 101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier}; 102bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 103d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]); 104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 10889af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc, i; 109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier pid_t child_pid; 110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier int status; 111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 112d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 118d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (i = 0; i < TST_TOTAL; ++i) { 121d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 122ed06ca62aea8ff284a88e4848bceb274ce20e708mridge switch (child_pid = FORK_OR_VFORK()) { 123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 124d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case -1: 125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* fork() failed */ 126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "fork() failed"); 127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier case 0: 130d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Child */ 131d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 132d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST(prctl(test_cases[i].option, 133d13d74bbf207c2d01598c6fef092a75b93b07c71vapier test_cases[i].arg2)); 134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((TEST_RETURN == -1) && (TEST_ERRNO == 135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_cases 136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao [i].exp_errno)) { 137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_resm(TWARN | TTERRNO, 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "prctl() returned %ld", 141923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak TEST_RETURN); 142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier exit(TEST_ERRNO); 143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier default: 146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Parent */ 147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((waitpid(child_pid, &status, 0)) < 0) { 148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "waitpid() failed"); 149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if ((WIFEXITED(status)) && (WEXITSTATUS(status) 153354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao == 154354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao test_cases 155354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao [i].exp_errno)) { 156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "Test Passed"); 157d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "Test Failed"); 159d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 161d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 1632c28215423293e443469a07ae7011135d058b671Garrett Cooper } 164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* cleanup and exit */ 166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 167d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 16853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_exit(); 169d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1702c28215423293e443469a07ae7011135d058b671Garrett Cooper} 171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */ 173c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void) 174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 175d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 176d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(FORK, DEF_HANDLER, cleanup); 177bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 179d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1802c28215423293e443469a07ae7011135d058b671Garrett Cooper} 181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 182d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 183d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() - performs all ONE TIME cleanup for this test at 184d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * completion or premature exit. 185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 186c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void) 187d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 188d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 189ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 190