mknod04.c revision 05a3b8ba2534b7f3506d9b2aacad5c59a5ce5809
1865695bbc89088b9526ea9045410e5afb70a985cplars/* 2865695bbc89088b9526ea9045410e5afb70a985cplars * 3865695bbc89088b9526ea9045410e5afb70a985cplars * Copyright (c) International Business Machines Corp., 2001 4865695bbc89088b9526ea9045410e5afb70a985cplars * 5865695bbc89088b9526ea9045410e5afb70a985cplars * This program is free software; you can redistribute it and/or modify 6865695bbc89088b9526ea9045410e5afb70a985cplars * it under the terms of the GNU General Public License as published by 7865695bbc89088b9526ea9045410e5afb70a985cplars * the Free Software Foundation; either version 2 of the License, or 8865695bbc89088b9526ea9045410e5afb70a985cplars * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 10865695bbc89088b9526ea9045410e5afb70a985cplars * This program is distributed in the hope that it will be useful, 11865695bbc89088b9526ea9045410e5afb70a985cplars * but WITHOUT ANY WARRANTY; without even the implied warranty of 12865695bbc89088b9526ea9045410e5afb70a985cplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13865695bbc89088b9526ea9045410e5afb70a985cplars * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 15865695bbc89088b9526ea9045410e5afb70a985cplars * You should have received a copy of the GNU General Public License 16865695bbc89088b9526ea9045410e5afb70a985cplars * along with this program; if not, write to the Free Software 17865695bbc89088b9526ea9045410e5afb70a985cplars * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * Test Name: mknod04 22865695bbc89088b9526ea9045410e5afb70a985cplars * 23865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description: 24865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that mknod(2) succeeds when used to create a filesystem 25865695bbc89088b9526ea9045410e5afb70a985cplars * node on a directory with set group-ID bit set. 26865695bbc89088b9526ea9045410e5afb70a985cplars * The node created should not have group-ID bit set and its gid should be 27865695bbc89088b9526ea9045410e5afb70a985cplars * equal to the effective gid of the process. 28865695bbc89088b9526ea9045410e5afb70a985cplars * 29865695bbc89088b9526ea9045410e5afb70a985cplars * Expected Result: 30865695bbc89088b9526ea9045410e5afb70a985cplars * mknod() should return value 0 on success and node created should not 31865695bbc89088b9526ea9045410e5afb70a985cplars * have set group-ID bit set and its gid should be equal to the effective 32865695bbc89088b9526ea9045410e5afb70a985cplars * gid of the process. 33865695bbc89088b9526ea9045410e5afb70a985cplars * 34865695bbc89088b9526ea9045410e5afb70a985cplars * Algorithm: 35865695bbc89088b9526ea9045410e5afb70a985cplars * Setup: 36865695bbc89088b9526ea9045410e5afb70a985cplars * Setup signal handling. 37865695bbc89088b9526ea9045410e5afb70a985cplars * Create temporary directory. 38865695bbc89088b9526ea9045410e5afb70a985cplars * Pause for SIGUSR1 if option specified. 39865695bbc89088b9526ea9045410e5afb70a985cplars * 40865695bbc89088b9526ea9045410e5afb70a985cplars * Test: 41865695bbc89088b9526ea9045410e5afb70a985cplars * Loop if the proper options are given. 42865695bbc89088b9526ea9045410e5afb70a985cplars * Execute system call 43865695bbc89088b9526ea9045410e5afb70a985cplars * Check return code, if system call failed (return=-1) 44865695bbc89088b9526ea9045410e5afb70a985cplars * Log the errno and Issue a FAIL message. 45865695bbc89088b9526ea9045410e5afb70a985cplars * Otherwise, 46865695bbc89088b9526ea9045410e5afb70a985cplars * Verify the Functionality of system call 47865695bbc89088b9526ea9045410e5afb70a985cplars * if successful, 48865695bbc89088b9526ea9045410e5afb70a985cplars * Issue Functionality-Pass message. 49865695bbc89088b9526ea9045410e5afb70a985cplars * Otherwise, 50865695bbc89088b9526ea9045410e5afb70a985cplars * Issue Functionality-Fail message. 51865695bbc89088b9526ea9045410e5afb70a985cplars * Cleanup: 52865695bbc89088b9526ea9045410e5afb70a985cplars * Print errno log and/or timing stats if options given 53865695bbc89088b9526ea9045410e5afb70a985cplars * Delete the temporary directory created. 54865695bbc89088b9526ea9045410e5afb70a985cplars * 55865695bbc89088b9526ea9045410e5afb70a985cplars * Usage: <for command-line> 56865695bbc89088b9526ea9045410e5afb70a985cplars * mknod04 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 57865695bbc89088b9526ea9045410e5afb70a985cplars * where, -c n : Run n copies concurrently. 58865695bbc89088b9526ea9045410e5afb70a985cplars * -f : Turn off functionality Testing. 59865695bbc89088b9526ea9045410e5afb70a985cplars * -i n : Execute test n times. 60865695bbc89088b9526ea9045410e5afb70a985cplars * -I x : Execute test for x seconds. 61865695bbc89088b9526ea9045410e5afb70a985cplars * -P x : Pause for x seconds between iterations. 62865695bbc89088b9526ea9045410e5afb70a985cplars * -t : Turn on syscall timing. 63865695bbc89088b9526ea9045410e5afb70a985cplars * 64865695bbc89088b9526ea9045410e5afb70a985cplars * HISTORY 65865695bbc89088b9526ea9045410e5afb70a985cplars * 07/2001 Ported by Wayne Boyer 66865695bbc89088b9526ea9045410e5afb70a985cplars * 67865695bbc89088b9526ea9045410e5afb70a985cplars * RESTRICTIONS: 68865695bbc89088b9526ea9045410e5afb70a985cplars * This test should be run by 'super-user' (root) only. 69865695bbc89088b9526ea9045410e5afb70a985cplars * 70865695bbc89088b9526ea9045410e5afb70a985cplars */ 71865695bbc89088b9526ea9045410e5afb70a985cplars 72865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 73865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdlib.h> 74865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h> 75865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 76865695bbc89088b9526ea9045410e5afb70a985cplars#include <string.h> 77865695bbc89088b9526ea9045410e5afb70a985cplars#include <signal.h> 78865695bbc89088b9526ea9045410e5afb70a985cplars#include <pwd.h> 79865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h> 80865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/stat.h> 81865695bbc89088b9526ea9045410e5afb70a985cplars 82865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 83865695bbc89088b9526ea9045410e5afb70a985cplars#include "usctest.h" 84865695bbc89088b9526ea9045410e5afb70a985cplars 85865695bbc89088b9526ea9045410e5afb70a985cplars#define LTPUSER "nobody" 86865695bbc89088b9526ea9045410e5afb70a985cplars#define MODE_RWX S_IFIFO | S_IRWXU | S_IRWXG | S_IRWXO 87865695bbc89088b9526ea9045410e5afb70a985cplars#define MODE_SGID S_IFIFO | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO 88865695bbc89088b9526ea9045410e5afb70a985cplars#define DIR_TEMP "testdir_4" 89865695bbc89088b9526ea9045410e5afb70a985cplars#define TNODE "tnode_%d" 90865695bbc89088b9526ea9045410e5afb70a985cplars 91865695bbc89088b9526ea9045410e5afb70a985cplarsstruct stat buf; /* struct. to hold stat(2) o/p contents */ 92865695bbc89088b9526ea9045410e5afb70a985cplarsstruct passwd *user1; /* struct. to hold getpwnam(3) o/p contents */ 93865695bbc89088b9526ea9045410e5afb70a985cplars 94865695bbc89088b9526ea9045410e5afb70a985cplarschar *TCID="mknod04"; /* Test program identifier. */ 95865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; /* Total number of test cases. */ 96865695bbc89088b9526ea9045410e5afb70a985cplarschar node_name[PATH_MAX]; /* buffer to hold node name created */ 97865695bbc89088b9526ea9045410e5afb70a985cplarsextern int Tst_count; /* Test Case counter for tst_* routines */ 98865695bbc89088b9526ea9045410e5afb70a985cplars 99865695bbc89088b9526ea9045410e5afb70a985cplarsgid_t group1_gid, group2_gid, mygid; /* user and process group id's */ 100865695bbc89088b9526ea9045410e5afb70a985cplarsuid_t save_myuid, user1_uid; /* user and process user id's */ 101865695bbc89088b9526ea9045410e5afb70a985cplarspid_t mypid; /* process id */ 102865695bbc89088b9526ea9045410e5afb70a985cplars 103865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(); /* setup function for the test */ 104865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(); /* cleanup function for the test */ 105865695bbc89088b9526ea9045410e5afb70a985cplars 106865695bbc89088b9526ea9045410e5afb70a985cplarsint 107865695bbc89088b9526ea9045410e5afb70a985cplarsmain(int ac, char **av) 108865695bbc89088b9526ea9045410e5afb70a985cplars{ 109865695bbc89088b9526ea9045410e5afb70a985cplars int lc; /* loop counter */ 110865695bbc89088b9526ea9045410e5afb70a985cplars int fflag; /* functionality flag variable */ 111865695bbc89088b9526ea9045410e5afb70a985cplars char *msg; /* message returned from parse_opts */ 112865695bbc89088b9526ea9045410e5afb70a985cplars 113865695bbc89088b9526ea9045410e5afb70a985cplars /* Parse standard options given to run the test. */ 114865695bbc89088b9526ea9045410e5afb70a985cplars msg = parse_opts(ac, av, (option_t *) NULL, NULL); 115865695bbc89088b9526ea9045410e5afb70a985cplars if (msg != (char *) NULL) { 116865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 117865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 118865695bbc89088b9526ea9045410e5afb70a985cplars } 119865695bbc89088b9526ea9045410e5afb70a985cplars 120865695bbc89088b9526ea9045410e5afb70a985cplars /* Perform global setup for test */ 121865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 122865695bbc89088b9526ea9045410e5afb70a985cplars 123865695bbc89088b9526ea9045410e5afb70a985cplars /* Check looping state if -i option given */ 124865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 125865695bbc89088b9526ea9045410e5afb70a985cplars /* Reset Tst_count in case we are looping. */ 126865695bbc89088b9526ea9045410e5afb70a985cplars Tst_count=0; 127865695bbc89088b9526ea9045410e5afb70a985cplars 128865695bbc89088b9526ea9045410e5afb70a985cplars /* 129865695bbc89088b9526ea9045410e5afb70a985cplars * TEST CASE CONDITION: 130865695bbc89088b9526ea9045410e5afb70a985cplars * Attempt to create a filesystem node on a directory 131865695bbc89088b9526ea9045410e5afb70a985cplars * with group id (sgid) bit set such that, 132865695bbc89088b9526ea9045410e5afb70a985cplars * the node created by mknod(2) should not have group id 133865695bbc89088b9526ea9045410e5afb70a985cplars * (sgid) bit set and node's gid should be equal to the 134865695bbc89088b9526ea9045410e5afb70a985cplars * effective gid of the process. 135865695bbc89088b9526ea9045410e5afb70a985cplars */ 136865695bbc89088b9526ea9045410e5afb70a985cplars TEST(mknod(node_name, MODE_RWX, 0)); 137865695bbc89088b9526ea9045410e5afb70a985cplars 138865695bbc89088b9526ea9045410e5afb70a985cplars /* Check return code from mknod(2) */ 139865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN == -1) { 140865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "mknod(%s, %#o, 0) failed, errno=%d : " 141865695bbc89088b9526ea9045410e5afb70a985cplars "%s", node_name, MODE_RWX, TEST_ERRNO, 142865695bbc89088b9526ea9045410e5afb70a985cplars strerror(TEST_ERRNO)); 143865695bbc89088b9526ea9045410e5afb70a985cplars continue; 144865695bbc89088b9526ea9045410e5afb70a985cplars } 145865695bbc89088b9526ea9045410e5afb70a985cplars /* 146865695bbc89088b9526ea9045410e5afb70a985cplars * Perform functional verification if test executed 147865695bbc89088b9526ea9045410e5afb70a985cplars * without (-f) option. 148865695bbc89088b9526ea9045410e5afb70a985cplars */ 149865695bbc89088b9526ea9045410e5afb70a985cplars if (STD_FUNCTIONAL_TEST) { 150865695bbc89088b9526ea9045410e5afb70a985cplars /* Set the functionality flag */ 151865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 1; 152865695bbc89088b9526ea9045410e5afb70a985cplars 153865695bbc89088b9526ea9045410e5afb70a985cplars /* Check for node's creation */ 154865695bbc89088b9526ea9045410e5afb70a985cplars if (stat(node_name, &buf) < 0) { 155865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "stat() of %s failed, errno:%d", 156865695bbc89088b9526ea9045410e5afb70a985cplars node_name, TEST_ERRNO); 157865695bbc89088b9526ea9045410e5afb70a985cplars /* unset fflag */ 158865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 159865695bbc89088b9526ea9045410e5afb70a985cplars } 160865695bbc89088b9526ea9045410e5afb70a985cplars 161865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify mode permissions of node */ 162865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_mode & S_ISGID) { 163865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "%s: Incorrect modes, setgid " 164865695bbc89088b9526ea9045410e5afb70a985cplars "bit set", node_name); 165865695bbc89088b9526ea9045410e5afb70a985cplars /* unset flag as functionality fails */ 166865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 167865695bbc89088b9526ea9045410e5afb70a985cplars } 168865695bbc89088b9526ea9045410e5afb70a985cplars 169865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify group ID of node */ 170865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_gid != group2_gid) { 171865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "%s: Incorrect group", 172865695bbc89088b9526ea9045410e5afb70a985cplars node_name); 173865695bbc89088b9526ea9045410e5afb70a985cplars /* unset flag as functionality fails */ 174865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 175865695bbc89088b9526ea9045410e5afb70a985cplars } 176865695bbc89088b9526ea9045410e5afb70a985cplars if (fflag) { 177865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "Functionality of mknod(%s, " 178865695bbc89088b9526ea9045410e5afb70a985cplars "%#o, 0) successful", 179865695bbc89088b9526ea9045410e5afb70a985cplars node_name, MODE_RWX); 180865695bbc89088b9526ea9045410e5afb70a985cplars } 181865695bbc89088b9526ea9045410e5afb70a985cplars } else { 182865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "call succeeded"); 183865695bbc89088b9526ea9045410e5afb70a985cplars } 184865695bbc89088b9526ea9045410e5afb70a985cplars 185865695bbc89088b9526ea9045410e5afb70a985cplars /* Remove the node for the next go `round */ 186865695bbc89088b9526ea9045410e5afb70a985cplars if (unlink(node_name) == -1) { 187865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TWARN, "unlink(%s) failed, errno:%d %s", 188865695bbc89088b9526ea9045410e5afb70a985cplars node_name, errno, strerror(errno)); 189865695bbc89088b9526ea9045410e5afb70a985cplars } 190865695bbc89088b9526ea9045410e5afb70a985cplars } 191865695bbc89088b9526ea9045410e5afb70a985cplars 192865695bbc89088b9526ea9045410e5afb70a985cplars /* Change the directory back to temporary directory */ 193865695bbc89088b9526ea9045410e5afb70a985cplars chdir(".."); 194865695bbc89088b9526ea9045410e5afb70a985cplars 195865695bbc89088b9526ea9045410e5afb70a985cplars /* 196865695bbc89088b9526ea9045410e5afb70a985cplars * Invoke cleanup() to delete the test directories created 197865695bbc89088b9526ea9045410e5afb70a985cplars * in the setup() and exit main(). 198865695bbc89088b9526ea9045410e5afb70a985cplars */ 199865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 200865695bbc89088b9526ea9045410e5afb70a985cplars 201865695bbc89088b9526ea9045410e5afb70a985cplars /*NOTREACHED*/ 202865695bbc89088b9526ea9045410e5afb70a985cplars} /* End main */ 203865695bbc89088b9526ea9045410e5afb70a985cplars 204865695bbc89088b9526ea9045410e5afb70a985cplars/* 205865695bbc89088b9526ea9045410e5afb70a985cplars * void 206865695bbc89088b9526ea9045410e5afb70a985cplars * setup(void) - performs all ONE TIME setup for this test. 207865695bbc89088b9526ea9045410e5afb70a985cplars * Exit the test program on receipt of unexpected signals. 208865695bbc89088b9526ea9045410e5afb70a985cplars * Create a temporary directory used to hold test directories created 209865695bbc89088b9526ea9045410e5afb70a985cplars * and change the directory to it. 210865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that pid of process executing the test is root. 211865695bbc89088b9526ea9045410e5afb70a985cplars * Create a test directory on temporary directory and set the ownership 212865695bbc89088b9526ea9045410e5afb70a985cplars * of test directory to guest user and process, change mode permissions 213865695bbc89088b9526ea9045410e5afb70a985cplars * to set group-id bit on it. 214865695bbc89088b9526ea9045410e5afb70a985cplars * Set the effective uid/gid of the process to that of guest user. 215865695bbc89088b9526ea9045410e5afb70a985cplars */ 216865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 217865695bbc89088b9526ea9045410e5afb70a985cplarssetup() 218865695bbc89088b9526ea9045410e5afb70a985cplars{ 219865695bbc89088b9526ea9045410e5afb70a985cplars char DIR_A[PATH_MAX]; 220865695bbc89088b9526ea9045410e5afb70a985cplars 221865695bbc89088b9526ea9045410e5afb70a985cplars /* Capture unexpected signals */ 222865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 223865695bbc89088b9526ea9045410e5afb70a985cplars 224865695bbc89088b9526ea9045410e5afb70a985cplars /* Check that the test process id is super/root */ 225865695bbc89088b9526ea9045410e5afb70a985cplars if (geteuid() != 0) { 226865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, NULL, "Must be super/root for this test!"); 227865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 228865695bbc89088b9526ea9045410e5afb70a985cplars } 229865695bbc89088b9526ea9045410e5afb70a985cplars 230865695bbc89088b9526ea9045410e5afb70a985cplars /* Pause if that option was specified */ 231865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 232865695bbc89088b9526ea9045410e5afb70a985cplars 233865695bbc89088b9526ea9045410e5afb70a985cplars /* Make a temp dir and cd to it */ 234865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 235865695bbc89088b9526ea9045410e5afb70a985cplars 23605a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars /* fix permissions on the tmpdir */ 23705a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars if (chmod(".", 0711) != 0) { 23805a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars tst_brkm(TBROK, cleanup, "chmod() failed"); 23905a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars } 24005a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars 241865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the real user id of the current test process */ 242865695bbc89088b9526ea9045410e5afb70a985cplars save_myuid = getuid(); 243865695bbc89088b9526ea9045410e5afb70a985cplars 244865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the process id of the current test process */ 245865695bbc89088b9526ea9045410e5afb70a985cplars mypid = getpid(); 246865695bbc89088b9526ea9045410e5afb70a985cplars 247865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the node name to be created in the test */ 248865695bbc89088b9526ea9045410e5afb70a985cplars sprintf(node_name, TNODE, mypid); 249865695bbc89088b9526ea9045410e5afb70a985cplars 250865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the uid/gid of ltp user */ 251865695bbc89088b9526ea9045410e5afb70a985cplars if ((user1 = getpwnam(LTPUSER)) == NULL) { 252865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "%s not in /etc/passwd", LTPUSER); 253865695bbc89088b9526ea9045410e5afb70a985cplars } 254865695bbc89088b9526ea9045410e5afb70a985cplars user1_uid = user1->pw_uid; 255865695bbc89088b9526ea9045410e5afb70a985cplars group1_gid = user1->pw_gid; 256865695bbc89088b9526ea9045410e5afb70a985cplars 257865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the effective group id of the test process */ 258865695bbc89088b9526ea9045410e5afb70a985cplars group2_gid = getegid(); 259865695bbc89088b9526ea9045410e5afb70a985cplars 260865695bbc89088b9526ea9045410e5afb70a985cplars /* 261865695bbc89088b9526ea9045410e5afb70a985cplars * Create a test directory under temporary directory with the 262865695bbc89088b9526ea9045410e5afb70a985cplars * specified mode permissions, with uid/gid set to that of guest 263865695bbc89088b9526ea9045410e5afb70a985cplars * user and the test process. 264865695bbc89088b9526ea9045410e5afb70a985cplars */ 265865695bbc89088b9526ea9045410e5afb70a985cplars if (mkdir(DIR_TEMP, MODE_RWX) < 0) { 266865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "mkdir(2) of %s failed", DIR_TEMP); 267865695bbc89088b9526ea9045410e5afb70a985cplars } 268865695bbc89088b9526ea9045410e5afb70a985cplars if (chown(DIR_TEMP, user1_uid, group2_gid) < 0) { 269865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "chown(2) of %s failed", DIR_TEMP); 270865695bbc89088b9526ea9045410e5afb70a985cplars } 271865695bbc89088b9526ea9045410e5afb70a985cplars if (chmod(DIR_TEMP, MODE_SGID) < 0) { 272865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "chmod(2) of %s failed", DIR_TEMP); 273865695bbc89088b9526ea9045410e5afb70a985cplars } 274865695bbc89088b9526ea9045410e5afb70a985cplars 275865695bbc89088b9526ea9045410e5afb70a985cplars /* 276865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that test directory created with expected permission modes 277865695bbc89088b9526ea9045410e5afb70a985cplars * and ownerships. 278865695bbc89088b9526ea9045410e5afb70a985cplars */ 279865695bbc89088b9526ea9045410e5afb70a985cplars if (stat(DIR_TEMP, &buf) < 0) { 280865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "stat(2) of %s failed", DIR_TEMP); 281865695bbc89088b9526ea9045410e5afb70a985cplars } 282865695bbc89088b9526ea9045410e5afb70a985cplars 283865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify modes of test directory */ 284865695bbc89088b9526ea9045410e5afb70a985cplars if (!(buf.st_mode & S_ISGID)) { 285865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 286865695bbc89088b9526ea9045410e5afb70a985cplars "%s: Incorrect modes, setgid bit not set", DIR_TEMP); 287865695bbc89088b9526ea9045410e5afb70a985cplars } 288865695bbc89088b9526ea9045410e5afb70a985cplars 289865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify group ID */ 290865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_gid != group2_gid) { 291865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "%s: Incorrect group", DIR_TEMP); 292865695bbc89088b9526ea9045410e5afb70a985cplars } 293865695bbc89088b9526ea9045410e5afb70a985cplars 294865695bbc89088b9526ea9045410e5afb70a985cplars /* 295865695bbc89088b9526ea9045410e5afb70a985cplars * Set the effective group id and user id of the test process 296865695bbc89088b9526ea9045410e5afb70a985cplars * to that of guest user (nobody) 297865695bbc89088b9526ea9045410e5afb70a985cplars */ 298865695bbc89088b9526ea9045410e5afb70a985cplars if (setgid(group1_gid) < 0) { 299865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 300865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to set process gid to that of ltp user"); 301865695bbc89088b9526ea9045410e5afb70a985cplars } 302865695bbc89088b9526ea9045410e5afb70a985cplars if (setreuid(-1, user1_uid) < 0) { 303865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 304865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to set process uid to that of ltp user"); 305865695bbc89088b9526ea9045410e5afb70a985cplars } 306865695bbc89088b9526ea9045410e5afb70a985cplars 307865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the real group ID of the current process */ 308865695bbc89088b9526ea9045410e5afb70a985cplars mygid = getgid(); 309865695bbc89088b9526ea9045410e5afb70a985cplars 310865695bbc89088b9526ea9045410e5afb70a985cplars /* Change directory to DIR_TEMP */ 311865695bbc89088b9526ea9045410e5afb70a985cplars if (chdir(DIR_TEMP) < 0) { 312865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 313865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to change to %s directory", DIR_TEMP); 314865695bbc89088b9526ea9045410e5afb70a985cplars } 315865695bbc89088b9526ea9045410e5afb70a985cplars} 316865695bbc89088b9526ea9045410e5afb70a985cplars 317865695bbc89088b9526ea9045410e5afb70a985cplars/* 318865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - Performs all ONE TIME cleanup for this test at 319865695bbc89088b9526ea9045410e5afb70a985cplars * completion or premature exit. 320865695bbc89088b9526ea9045410e5afb70a985cplars * Print test timing stats and errno log if test executed with options. 321865695bbc89088b9526ea9045410e5afb70a985cplars * Restore the real/effective user id of the process changed during 322865695bbc89088b9526ea9045410e5afb70a985cplars * setup(). 323865695bbc89088b9526ea9045410e5afb70a985cplars * Remove temporary directory and sub-directories/files under it 324865695bbc89088b9526ea9045410e5afb70a985cplars * created during setup(). 325865695bbc89088b9526ea9045410e5afb70a985cplars * Exit the test program with normal exit code. 326865695bbc89088b9526ea9045410e5afb70a985cplars */ 327865695bbc89088b9526ea9045410e5afb70a985cplarsvoid 328865695bbc89088b9526ea9045410e5afb70a985cplarscleanup() 329865695bbc89088b9526ea9045410e5afb70a985cplars{ 330865695bbc89088b9526ea9045410e5afb70a985cplars /* 331865695bbc89088b9526ea9045410e5afb70a985cplars * print timing stats if that option was specified. 332865695bbc89088b9526ea9045410e5afb70a985cplars * print errno log if that option was specified. 333865695bbc89088b9526ea9045410e5afb70a985cplars */ 334865695bbc89088b9526ea9045410e5afb70a985cplars TEST_CLEANUP; 335865695bbc89088b9526ea9045410e5afb70a985cplars 336865695bbc89088b9526ea9045410e5afb70a985cplars /* 337865695bbc89088b9526ea9045410e5afb70a985cplars * Restore the effective uid of the process changed in the 338865695bbc89088b9526ea9045410e5afb70a985cplars * setup(). 339865695bbc89088b9526ea9045410e5afb70a985cplars */ 340865695bbc89088b9526ea9045410e5afb70a985cplars if (setreuid(-1, save_myuid) < 0) { 341865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 342865695bbc89088b9526ea9045410e5afb70a985cplars "resetting process real/effective uid failed"); 343865695bbc89088b9526ea9045410e5afb70a985cplars } 344865695bbc89088b9526ea9045410e5afb70a985cplars 345865695bbc89088b9526ea9045410e5afb70a985cplars /* Remove files and temporary directory created */ 346865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 347865695bbc89088b9526ea9045410e5afb70a985cplars 348865695bbc89088b9526ea9045410e5afb70a985cplars /* exit with return code appropriate for results */ 349865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 350865695bbc89088b9526ea9045410e5afb70a985cplars} 351