1d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew/*
2d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
3d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
4d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * This program is free software; you can redistribute it and/or modify it
5d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * under the terms of version 2 of the GNU General Public License as
6d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * published by the Free Software Foundation.
7d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
8d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * This program is distributed in the hope that it would be useful, but
9d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * WITHOUT ANY WARRANTY; without even the implied warranty of
10d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
12d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 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.
15d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
16d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew */
17d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew/**********************************************************
184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
19d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    TEST IDENTIFIER	: capget02
204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
21d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    EXECUTED BY	: anyone
224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
23d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    TEST TITLE	: Tests for error conditions.
244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
25d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    TEST CASE TOTAL	: 5
264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
27d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    AUTHOR		: Saji Kumar.V.R <saji.kumar@wipro.com>
284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
29d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    SIGNALS
30d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	Uses SIGUSR1 to pause before test if option set.
31d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	(See the parse_opts(3) man page).
32d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
33d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *    DESCRIPTION
34d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	Verify that
35d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	1) capget() fails with errno set to EFAULT if an invalid address
36d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	   is given for header
37d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	2) capget() fails with errno set to EFAULT if an invalid address
38d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	   is given for data
39d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	3) capget() fails with errno set to EINVAL if an invalid value
40d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	   is given for header->version
41d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	4) capget() fails with errno set to EINVAL if header->pid < 0
42d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	5) capget() fails with errno set to ESRCH if the process with
43d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	   pid, header->pid does not exit
44bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak *
454bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
46d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	Setup:
47d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	  Setup signal handling.
48d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	  Pause for SIGUSR1 if option specified.
494bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
50d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	Test:
51d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	 Loop if the proper options are given.
52d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	  call capget with proper arguments
53d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	  if capget() fails with expected errno
54d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *		Test passed
55d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *	  Otherwise
56d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *		Test failed
574bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
58d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	Cleanup:
59d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * 	  Print errno log and/or timing stats if options given
604bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
61d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * USAGE:  <for command-line>
62d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew * capget02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p]
63d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *			where,  -c n : Run n copies concurrently.
64d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-e   : Turn on errno logging.
65d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-h   : Show help screen
66d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-f   : Turn off functional testing
67d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-i n : Execute test n times.
68d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-I x : Execute test for x seconds.
69d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-p   : Pause for SIGUSR1 before starting
70d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-P x : Pause for x seconds between iterations.
71d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *				-t   : Turn on syscall timing.
72d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *
73d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew ****************************************************************/
74d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
75d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew#include <errno.h>
76d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew#include "test.h"
77817d8095fbfe5ebe22b29f58b7483f3d8d5e3fccRichard Palethorpe#include "lapi/syscalls.h"
78e775759cfee3c31a0c0cc1a3f33be0c4f7691aabrobbiew
79e775759cfee3c31a0c0cc1a3f33be0c4f7691aabrobbiew/**************************************************************************/
80e775759cfee3c31a0c0cc1a3f33be0c4f7691aabrobbiew/*                                                                        */
81e775759cfee3c31a0c0cc1a3f33be0c4f7691aabrobbiew/*   Some archs do not have the manpage documented sys/capability.h file, */
8204a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew/*   and require the use of the line below                                */
8304a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew
8404a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew#include <linux/capability.h>
8504a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew
8604a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew/*   If you are having issues with including this file and have the sys/  */
8704a8ba521ab41fed9e2f000fca4efb05fb2ad7b1robbiew/*   version, then you may want to try switching to it. -Robbie W.        */
88e775759cfee3c31a0c0cc1a3f33be0c4f7691aabrobbiew/**************************************************************************/
89d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
90d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstatic void setup();
91d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstatic void cleanup();
92d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstatic void test_setup(int);
93d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
94fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "capget02";
95d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
96d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstatic struct __user_cap_header_struct header;
97d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstatic struct __user_cap_data_struct data;
98d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
99d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewstruct test_case_t {
100d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	cap_user_header_t headerp;
101d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	cap_user_data_t datap;
102d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	int exp_errno;
103d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	char *errdesc;
104d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew} test_cases[] = {
1057ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifndef UCLINUX
1067ec19d9c95d491394401f8e2d88ec94f13f596dfvapier	/* Skip since uClinux does not implement memory protection */
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	(cap_user_header_t) - 1, &data, EFAULT, "EFAULT"}, {
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	&header, (cap_user_data_t) - 1, EFAULT, "EFAULT"},
1107ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	{
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	&header, &data, EINVAL, "EINVAL"}, {
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	&header, &data, EINVAL, "EINVAL"}, {
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	&header, &data, ESRCH, "ESRCH"}
115d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew};
116d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
117d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiewint TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]);
118d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av)
120d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew{
121d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
12289af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc, i;
123d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
124d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
125d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
126d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	setup();
127d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
128d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	for (lc = 0; TEST_LOOPING(lc); lc++) {
129d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
130d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
131d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
132d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		for (i = 0; i < TST_TOTAL; ++i) {
133d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew			test_setup(i);
134359980f68b19c77c698b121b57a071dfe6e3ca31Jan Stancek			TEST(ltp_syscall(__NR_capget, test_cases[i].headerp,
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     test_cases[i].datap));
136d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
13717b121b3d967f4c137569d4ce9615c6a3679dcc9Garrett Cooper			if (TEST_RETURN == -1 &&
13817b121b3d967f4c137569d4ce9615c6a3679dcc9Garrett Cooper			    TEST_ERRNO == test_cases[i].exp_errno) {
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TPASS | TTERRNO,
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "capget failed as expected");
141d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew			} else {
142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				tst_resm(TFAIL | TTERRNO,
143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 "capget failed unexpectedly (%ld)",
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 TEST_RETURN);
145d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew			}
1464bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak		}
1472c28215423293e443469a07ae7011135d058b671Garrett Cooper	}
148d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
149d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	cleanup();
150d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
15153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
152d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
1532c28215423293e443469a07ae7011135d058b671Garrett Cooper}
154d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
155d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew/* setup() - performs all ONE TIME setup for this test */
156c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid setup(void)
157d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew{
1582c28215423293e443469a07ae7011135d058b671Garrett Cooper
159d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	tst_sig(NOFORK, DEF_HANDLER, cleanup);
160d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
161d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	TEST_PAUSE;
162d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
1632c28215423293e443469a07ae7011135d058b671Garrett Cooper}
164d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
165d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew/*
166d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *cleanup() -  performs all ONE TIME cleanup for this test at
167d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew *		completion or premature exit.
168d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew */
169c57fba5535abf457e33dd7a986b6c512d95cdef6Mike Frysingervoid cleanup(void)
170d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew{
1712c28215423293e443469a07ae7011135d058b671Garrett Cooper}
172d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
17356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid test_setup(int i)
174d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew{
1757ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#ifdef UCLINUX
17656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	i = i + 2;
1777ec19d9c95d491394401f8e2d88ec94f13f596dfvapier#endif
178d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	switch (i) {
179d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew
18056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	case 0:
181d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		break;
18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	case 1:
183d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.version = _LINUX_CAPABILITY_VERSION;
184d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.pid = getpid();
185d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		break;
18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	case 2:
187d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.version = 0;
188d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.pid = getpid();
189d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		break;
19056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	case 3:
191d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.version = _LINUX_CAPABILITY_VERSION;
192d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.pid = -1;
193d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		break;
19456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	case 4:
195d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		header.version = _LINUX_CAPABILITY_VERSION;
19623b37f3e039c03ffee10b66f0df637340903577eStanislav Kholmanskikh		header.pid = tst_get_unused_pid(cleanup);
197d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew		break;
198d771da7926cda6ab04c6b5eb49b47cb5dbc5a6d2robbiew	}
199ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
200