prctl02.c revision 53740500924f6439623a8ac256b5be2d6c59ed1f
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
13d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * with this program; if not, write the Free Software Foundation, Inc., 59
14d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Temple Place - Suite 330, Boston MA 02111-1307, 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
60bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak *
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
92d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar *TCID = "prctl02";		/* Test program identifier.    */
93d13d74bbf207c2d01598c6fef092a75b93b07c71vapierextern int Tst_count;		/* Test Case counter for tst_* routines */
9456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic int exp_enos[] = { EINVAL, EINVAL, 0 };
95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
96d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct test_cases_t {
97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int option;
98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	unsigned long arg2;
99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int exp_errno;
100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} test_cases[] = {
10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	{
10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	OPTION_INVALID, 0, EINVAL}, {
10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	PR_SET_PDEATHSIG, INVALID_ARG, EINVAL}
104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier};
105bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
106d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]);
107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int lc, i;		/* loop counter */
112d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	char *msg;		/* message returned from parse_opts */
113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	pid_t child_pid;
114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int status;
115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* parse standard options */
11753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper<<<<<<< HEAD
11845e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL))
11945e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper	    != NULL) {
12060fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
12153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper=======
12256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if ((msg = parse_opts(ac, av, (option_t *) NULL, NULL))
12343088e16aa60d69e3ec5a69cdd8bdd45b8891127Garrett Cooper	    != NULL) {
12453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
12553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper>>>>>>> master
126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* perform global setup for test */
129d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	setup();
130d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
131d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* check looping state if -i option given */
132d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	for (lc = 0; TEST_LOOPING(lc); lc++) {
133d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* reset Tst_count in case we are looping. */
135d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		Tst_count = 0;
136d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		for (i = 0; i < TST_TOTAL; ++i) {
138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
139ed06ca62aea8ff284a88e4848bceb274ce20e708mridge			switch (child_pid = FORK_OR_VFORK()) {
140d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
141d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case -1:
142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* fork() failed */
143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				tst_resm(TFAIL, "fork() failed");
144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				continue;
145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case 0:
147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* Child */
148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				TEST(prctl(test_cases[i].option,
150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					   test_cases[i].arg2));
151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((TEST_RETURN == -1) && (TEST_ERRNO ==
15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak							    test_cases[i].
15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak							    exp_errno)) {
154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					exit(TEST_ERRNO);
155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
156923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak					tst_resm(TWARN|TTERRNO, "prctl() returned %ld",
157923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak						 TEST_RETURN);
158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					exit(TEST_ERRNO);
159d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
160d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
161d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			default:
162d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				/* Parent */
163d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((waitpid(child_pid, &status, 0)) < 0) {
164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TFAIL, "waitpid() failed");
165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					continue;
166d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
167d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
168d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if ((WIFEXITED(status)) && (WEXITSTATUS(status)
16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak							    == test_cases[i].
17056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak							    exp_errno)) {
171d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TPASS, "Test Passed");
172d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
173d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					tst_resm(TFAIL, "Test Failed");
174d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
175d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				TEST_ERROR_LOG(WEXITSTATUS(status));
176d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
177d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
17956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	}			/* End for TEST_LOOPING */
180d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
181d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* cleanup and exit */
182d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	cleanup();
183d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
18453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak}				/* End main */
187d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
188d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* setup() - performs all ONE TIME setup for this test */
18956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup()
190d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
191d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
192d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* capture signals */
193d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	tst_sig(FORK, DEF_HANDLER, cleanup);
194bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
195d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* set the expected errnos... */
196d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	TEST_EXP_ENOS(exp_enos);
197d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
198d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* Pause if that option was specified */
199d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	TEST_PAUSE;
200d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
20156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak}				/* End setup() */
202d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
203d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
204d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *cleanup() -  performs all ONE TIME cleanup for this test at
205d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *		completion or premature exit.
206d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
20756207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup()
208d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
209d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
210d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
211d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * print timing stats if that option was specified.
212d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * print errno log if that option was specified.
213d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
214d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	TEST_CLEANUP;
215d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
216d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* exit with return code appropriate for results */
217d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	tst_exit();
21856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak}				/* End cleanup() */
219