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