keyctl01.c revision 4e7726497211222385eaee5e7cf2968842702a46
15c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
2faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Copyright (c) Crackerjack Project., 2007				   */
3faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
45c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* This program is free software;  you can redistribute it and/or modify      */
55c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* it under the terms of the GNU General Public License as published by       */
6faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* the Free Software Foundation; either version 2 of the License, or	  */
7faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* (at your option) any later version.					*/
8faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
9faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* This program is distributed in the hope that it will be useful,	    */
10faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* but WITHOUT ANY WARRANTY;  without even the implied warranty of	    */
11faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See		  */
12faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* the GNU General Public License for more details.			   */
13faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
14faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* You should have received a copy of the GNU General Public License	  */
15faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* along with this program;  if not, write to the Free Software	       */
165c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
17faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
185c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
195c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
20faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
21faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* File:	keyctl01.c				   		      */
22faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
23faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Description: This tests the keyctl() syscall				      */
24faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*		Manipulate the kernel's key management facility	       */
25faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Usage:  <for command-line>						 */
26faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* keyctl01 [-c n] [-e][-i n] [-I x] [-p x] [-t]		     	      */
27faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*      where,  -c n : Run n copies concurrently.			     */
28faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      -e   : Turn on errno logging.				 */
29faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      -i n : Execute test n times.				  */
30faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      -I x : Execute test for x seconds.			    */
31faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      -P x : Pause for x seconds between iterations.		*/
32faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      -t   : Turn on syscall timing.				*/
33faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
34faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Total Tests: 2							     */
35faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
36faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Test Name:   keyctl01					     	      */
37faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* History:     Porting from Crackerjack to LTP is done by		    */
38faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      Manas Kumar Nayak maknayak@in.ibm.com>			*/
395c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
405c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
415c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include <linux/keyctl.h>
42da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <errno.h>
434e7726497211222385eaee5e7cf2968842702a46Garrett Cooper#include <keyutils.h>
44da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <limits.h>
45da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <stdio.h>
464e7726497211222385eaee5e7cf2968842702a46Garrett Cooper
475c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Harness Specific Include Files. */
485c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "test.h"
495c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "usctest.h"
505c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "linux_syscall_numbers.h"
515c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
525c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Extern Global Variables */
53faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyaextern int Tst_count;	/* counter for tst_xxx routines.	 */
54faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyaextern char *TESTDIR;	/* temporary dir created by tst_tmpdir() */
555c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
565c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Global Variables */
57faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyachar *TCID = "keyctl01";/* Test program identifier.*/
585c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakint  testno;
59faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyaint  TST_TOTAL = 2;	/* total number of tests in this file.   */
605c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
615c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Extern Global Functions */
625c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
63faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
64faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Function:    cleanup						       */
65faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
665c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Description: Performs all one time clean up for this test on successful    */
67faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      completion,  premature exit or  failure. Closes all temporary */
68faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      files, removes all temporary directories exits the test with  */
69faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      appropriate return code by calling tst_exit() function.       */
70faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
71faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Input:       None.							 */
72faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
73faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Output:      None.							 */
74faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
755c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Return:      On failure - Exits calling tst_exit(). Non '0' return code.   */
76faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      On success - Exits calling tst_exit(). With '0' return code.  */
77faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
785c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
795c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakextern void cleanup() {
80faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Remove tmp dir and all files in it */
81faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_CLEANUP;
82faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_rmdir();
835c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
84faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Exit with appropriate return code. */
85faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_exit();
865c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
875c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
885c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Local  Functions */
895c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
90faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
91faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Function:    setup							 */
92faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
935c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Description: Performs all one time setup for this test. This function is   */
94faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      typically used to capture signals, create temporary dirs      */
95faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      and temporary files that may be used in the course of this    */
96faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      test.							 */
97faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
98faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Input:       None.							 */
99faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
100faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Output:      None.							 */
101faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
102faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Return:      On failure - Exits by calling cleanup().		      */
103faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      On success - returns 0.				       */
104faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
1055c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
1065c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakvoid setup() {
107faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Capture signals if any */
108faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Create temporary directories */
109faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_PAUSE;
110faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_tmpdir();
1115c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
1125c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
1135c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakint main(int ac, char **av) {
114c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya	int ret;
115faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	int lc;		/* loop counter */
116da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	key_serial_t ne_key;
117faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	char *msg;	/* message returned from parse_opts */
118faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
119faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* parse standard options */
120faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){
121faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
122faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		tst_exit();
123faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	}
124faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
125faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	setup();
126faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
127faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Check looping state if -i option given */
128faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	for (lc = 0; TEST_LOOPING(lc); lc++) {
129faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
130faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		Tst_count = 0;
131faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
132faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		for (testno = 1; testno < TST_TOTAL; ++testno) {
133da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
134faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl() and ask for a keyring's ID. */
135c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			ret = syscall(__NR_keyctl, KEYCTL_GET_KEYRING_ID,
136c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya					KEY_SPEC_USER_SESSION_KEYRING);
137c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
138c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya				tst_resm(TPASS,"KEYCTL_GET_KEYRING_ID succeeded");
139faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			} else {
140da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper		 		tst_resm(TFAIL|TERRNO, "KEYCTL_GET_KEYRING_ID");
141da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			}
142da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
143da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			for (ne_key = INT32_MAX; ne_key > INT32_MIN;
144da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			    ne_key--) {
145da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				ret = syscall(__NR_keyctl, KEYCTL_READ,
146da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					ne_key);
147da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				if (ret == -1 && errno == ENOKEY)
148da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					break;
149faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
150faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
151faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl. */
152da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			ret = syscall(__NR_keyctl, KEYCTL_REVOKE, ne_key);
153c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
154da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				tst_resm(TFAIL|TERRNO,
155da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					"KEYCTL_REVOKE succeeded unexpectedly");
156c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			} else {
157faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				/* Check for the correct error num. */
158c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya				if (errno == ENOKEY) {
159da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					tst_resm(TPASS|TERRNO,
160da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"KEYCTL_REVOKE got expected "
161da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"errno");
162faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				} else {
163da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					tst_resm(TFAIL|TERRNO,
164da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"KEYCTL_REVOKE got unexpected "
165da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"errno");
1665c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak				}
1675c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
168faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
169faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
170faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		}
1715c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
172faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	}
173faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	cleanup();
174da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	/* NOTREACHED */
175da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	return (1);
176faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya}
177