• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  * Copyright (c) Crackerjack Project., 2007				      *
3  *									      *
4  * This program is free software;  you can redistribute it and/or modify      *
5  * it under the terms of the GNU General Public License as published by       *
6  * the Free Software Foundation; either version 2 of the License, or	      *
7  * (at your option) any later version.					      *
8  *									      *
9  * This program is distributed in the hope that it will be useful,	      *
10  * but WITHOUT ANY WARRANTY;  without even the implied warranty of	      *
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See		      *
12  * the GNU General Public License for more details.			      *
13  *									      *
14  * You should have received a copy of the GNU General Public License	      *
15  * along with this program;  if not, write to the Free Software Foundation,   *
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           *
17  *                                                                            *
18  ******************************************************************************/
19 /*
20  * Description: This tests the keyctl() syscall
21  *		Manipulate the kernel's key management facility
22  *
23  * History:     Porting from Crackerjack to LTP is done by
24  *	      Manas Kumar Nayak maknayak@in.ibm.com>
25  */
26 
27 #include "config.h"
28 #include <sys/types.h>
29 #include <errno.h>
30 #include <limits.h>
31 #include <stdio.h>
32 #include <stdint.h>
33 #ifdef HAVE_LINUX_KEYCTL_H
34 # include <linux/keyctl.h>
35 #endif
36 
37 #include "test.h"
38 #include "linux_syscall_numbers.h"
39 
40 char *TCID = "keyctl01";
41 int testno;
42 int TST_TOTAL = 2;
43 
44 #ifdef HAVE_LINUX_KEYCTL_H
45 
cleanup(void)46 static void cleanup(void)
47 {
48 	tst_rmdir();
49 }
50 
setup(void)51 static void setup(void)
52 {
53 	TEST_PAUSE;
54 	tst_tmpdir();
55 }
56 
main(int ac,char ** av)57 int main(int ac, char **av)
58 {
59 	int ret;
60 	int lc;
61 	int32_t ne_key;
62 
63 	tst_parse_opts(ac, av, NULL, NULL);
64 
65 	setup();
66 
67 	for (lc = 0; TEST_LOOPING(lc); lc++) {
68 
69 		tst_count = 0;
70 
71 		for (testno = 1; testno < TST_TOTAL; ++testno) {
72 
73 			/* Call keyctl() and ask for a keyring's ID. */
74 			ret = ltp_syscall(__NR_keyctl, KEYCTL_GET_KEYRING_ID,
75 				      KEY_SPEC_USER_SESSION_KEYRING);
76 			if (ret != -1) {
77 				tst_resm(TPASS,
78 					 "KEYCTL_GET_KEYRING_ID succeeded");
79 			} else {
80 				tst_resm(TFAIL | TERRNO,
81 					 "KEYCTL_GET_KEYRING_ID");
82 			}
83 
84 			for (ne_key = INT32_MAX; ne_key > INT32_MIN; ne_key--) {
85 				ret = ltp_syscall(__NR_keyctl, KEYCTL_READ,
86 					ne_key);
87 				if (ret == -1 && errno == ENOKEY)
88 					break;
89 			}
90 
91 			/* Call keyctl. */
92 			ret = ltp_syscall(__NR_keyctl, KEYCTL_REVOKE, ne_key);
93 			if (ret != -1) {
94 				tst_resm(TFAIL | TERRNO,
95 					 "KEYCTL_REVOKE succeeded unexpectedly");
96 			} else {
97 				/* Check for the correct error num. */
98 				if (errno == ENOKEY) {
99 					tst_resm(TPASS | TERRNO,
100 						 "KEYCTL_REVOKE got expected "
101 						 "errno");
102 				} else {
103 					tst_resm(TFAIL | TERRNO,
104 						 "KEYCTL_REVOKE got unexpected "
105 						 "errno");
106 				}
107 
108 			}
109 
110 		}
111 
112 	}
113 	cleanup();
114 	tst_exit();
115 }
116 #else
main(void)117 int main(void)
118 {
119 	tst_brkm(TCONF, NULL, "keyctl syscall support not available on system");
120 }
121 #endif /* HAVE_LINUX_KEYCTL_H */
122