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