keyctl01.c revision 89af32a63ce8a780ea39337339e14caae244b5a4
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	       */
164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
41020a4da94272edfc2066bc6c36f7db33bea9e067Garrett Cooper#include "config.h"
426340c2a410a504efd154804f36910c5a8dabce6bGarrett Cooper#include <sys/types.h>
43e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
445c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include <linux/keyctl.h>
45e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#endif
46da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <errno.h>
47e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
484e7726497211222385eaee5e7cf2968842702a46Garrett Cooper#include <keyutils.h>
49e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#endif
50da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <limits.h>
51da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper#include <stdio.h>
524e7726497211222385eaee5e7cf2968842702a46Garrett Cooper
535c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Harness Specific Include Files. */
545c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "test.h"
555c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "usctest.h"
565c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak#include "linux_syscall_numbers.h"
575c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
585c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Extern Global Variables */
595c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
605c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Global Variables */
61faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyachar *TCID = "keyctl01";/* Test program identifier.*/
625c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakint  testno;
63faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneyaint  TST_TOTAL = 2;	/* total number of tests in this file.   */
645c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
65e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#if HAVE_KEYCTL_SYSCALL
665c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Extern Global Functions */
675c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
68faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
69faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Function:    cleanup						       */
70faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
715c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Description: Performs all one time clean up for this test on successful    */
72faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      completion,  premature exit or  failure. Closes all temporary */
73faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      files, removes all temporary directories exits the test with  */
74faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      appropriate return code by calling tst_exit() function.       */
75faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
76faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Input:       None.							 */
77faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
78faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Output:      None.							 */
79faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
805c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Return:      On failure - Exits calling tst_exit(). Non '0' return code.   */
81faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      On success - Exits calling tst_exit(). With '0' return code.  */
82faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
835c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
845c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakextern void cleanup() {
852c28215423293e443469a07ae7011135d058b671Garrett Cooper
86faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_CLEANUP;
87faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_rmdir();
885c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
895c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
905c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
915c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Local  Functions */
925c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
93faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
94faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Function:    setup							 */
95faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
965c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/* Description: Performs all one time setup for this test. This function is   */
97faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      typically used to capture signals, create temporary dirs      */
98faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      and temporary files that may be used in the course of this    */
99faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      test.							 */
100faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
101faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Input:       None.							 */
102faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
103faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Output:      None.							 */
104faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
105faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/* Return:      On failure - Exits by calling cleanup().		      */
106faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*	      On success - returns 0.				       */
107faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya/*									    */
1085c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak/******************************************************************************/
1095c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakvoid setup() {
110faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Capture signals if any */
111faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	/* Create temporary directories */
112faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	TEST_PAUSE;
113faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	tst_tmpdir();
1145c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak}
1155c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
1165c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modakint main(int ac, char **av) {
117c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya	int ret;
11889af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
119da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	key_serial_t ne_key;
12089af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	char *msg;
121faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
122df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) {
12360fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
124faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		tst_exit();
125faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	}
126faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
127faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	setup();
128faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
129faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	for (lc = 0; TEST_LOOPING(lc); lc++) {
130faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
131faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		Tst_count = 0;
132faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
133faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		for (testno = 1; testno < TST_TOTAL; ++testno) {
134da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
135faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl() and ask for a keyring's ID. */
136c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			ret = syscall(__NR_keyctl, KEYCTL_GET_KEYRING_ID,
137c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya					KEY_SPEC_USER_SESSION_KEYRING);
138c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
139c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya				tst_resm(TPASS,"KEYCTL_GET_KEYRING_ID succeeded");
140faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			} else {
141da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper		 		tst_resm(TFAIL|TERRNO, "KEYCTL_GET_KEYRING_ID");
142da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			}
143da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper
144da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			for (ne_key = INT32_MAX; ne_key > INT32_MIN;
145da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			    ne_key--) {
146da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				ret = syscall(__NR_keyctl, KEYCTL_READ,
147da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					ne_key);
148da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				if (ret == -1 && errno == ENOKEY)
149da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					break;
150faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
151faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
152faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			/* Call keyctl. */
153da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper			ret = syscall(__NR_keyctl, KEYCTL_REVOKE, ne_key);
154c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			if (ret != -1) {
155da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper				tst_resm(TFAIL|TERRNO,
156da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					"KEYCTL_REVOKE succeeded unexpectedly");
157c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya			} else {
158faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				/* Check for the correct error num. */
159c2e8839e8801e0f01a6efb7d2cff10c86c5d55a4yaberauneya				if (errno == ENOKEY) {
160da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					tst_resm(TPASS|TERRNO,
161da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"KEYCTL_REVOKE got expected "
162da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"errno");
163faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya				} else {
164da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper					tst_resm(TFAIL|TERRNO,
165da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"KEYCTL_REVOKE got unexpected "
166da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper						"errno");
1675c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak				}
1685c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
169faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya			}
170faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya
171faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya		}
1725c8fc01200ab5fedc1a1c4cb0989e6bfe1fc0c47subrata_modak
173faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	}
174faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya	cleanup();
1752c28215423293e443469a07ae7011135d058b671Garrett Cooper
176da908058635ca58caf3e85814f2eba68febad1e1Garrett Cooper	return (1);
177faf0748216a2c3f2716131f0958ed34ea874d7e7yaberauneya}
178e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper#else
179e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooperint
180e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Coopermain(void)
181e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper{
182e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper	tst_resm(TCONF, "keyctl syscall support not available on system");
183e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper	tst_exit();
184e99ebbc091b9a6244864d5f80a4ae2e70f65a70dGarrett Cooper}
185ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman#endif
186