mknod04.c revision fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716
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 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 21865695bbc89088b9526ea9045410e5afb70a985cplars * Test Name: mknod04 22865695bbc89088b9526ea9045410e5afb70a985cplars * 23865695bbc89088b9526ea9045410e5afb70a985cplars * Test Description: 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Verify that mknod(2) succeeds when used to create a filesystem 25865695bbc89088b9526ea9045410e5afb70a985cplars * node on a directory with set group-ID bit set. 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 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) 4456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Log the errno and Issue a FAIL message. 45865695bbc89088b9526ea9045410e5afb70a985cplars * Otherwise, 4656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Verify the Functionality of system call 47865695bbc89088b9526ea9045410e5afb70a985cplars * if successful, 4856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * 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 94fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubischar *TCID = "mknod04"; 95fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubisint TST_TOTAL = 1; 96865695bbc89088b9526ea9045410e5afb70a985cplarschar node_name[PATH_MAX]; /* buffer to hold node name created */ 97865695bbc89088b9526ea9045410e5afb70a985cplars 98865695bbc89088b9526ea9045410e5afb70a985cplarsgid_t group1_gid, group2_gid, mygid; /* user and process group id's */ 99865695bbc89088b9526ea9045410e5afb70a985cplarsuid_t save_myuid, user1_uid; /* user and process user id's */ 100865695bbc89088b9526ea9045410e5afb70a985cplarspid_t mypid; /* process id */ 101865695bbc89088b9526ea9045410e5afb70a985cplars 102865695bbc89088b9526ea9045410e5afb70a985cplarsvoid setup(); /* setup function for the test */ 103865695bbc89088b9526ea9045410e5afb70a985cplarsvoid cleanup(); /* cleanup function for the test */ 104865695bbc89088b9526ea9045410e5afb70a985cplars 10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int ac, char **av) 106865695bbc89088b9526ea9045410e5afb70a985cplars{ 10789af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 108865695bbc89088b9526ea9045410e5afb70a985cplars int fflag; /* functionality flag variable */ 10989af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis char *msg; 110865695bbc89088b9526ea9045410e5afb70a985cplars 11145e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper msg = parse_opts(ac, av, NULL, NULL); 11245e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if (msg != NULL) { 113865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 1142c28215423293e443469a07ae7011135d058b671Garrett Cooper 115865695bbc89088b9526ea9045410e5afb70a985cplars } 116865695bbc89088b9526ea9045410e5afb70a985cplars 117865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 118865695bbc89088b9526ea9045410e5afb70a985cplars 119865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 1202c28215423293e443469a07ae7011135d058b671Garrett Cooper 121d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 122865695bbc89088b9526ea9045410e5afb70a985cplars 123865695bbc89088b9526ea9045410e5afb70a985cplars /* 1244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * TEST CASE CONDITION: 125865695bbc89088b9526ea9045410e5afb70a985cplars * Attempt to create a filesystem node on a directory 126865695bbc89088b9526ea9045410e5afb70a985cplars * with group id (sgid) bit set such that, 127865695bbc89088b9526ea9045410e5afb70a985cplars * the node created by mknod(2) should not have group id 128865695bbc89088b9526ea9045410e5afb70a985cplars * (sgid) bit set and node's gid should be equal to the 129865695bbc89088b9526ea9045410e5afb70a985cplars * effective gid of the process. 130865695bbc89088b9526ea9045410e5afb70a985cplars */ 131865695bbc89088b9526ea9045410e5afb70a985cplars TEST(mknod(node_name, MODE_RWX, 0)); 132bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 133865695bbc89088b9526ea9045410e5afb70a985cplars /* Check return code from mknod(2) */ 134865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN == -1) { 135865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "mknod(%s, %#o, 0) failed, errno=%d : " 136865695bbc89088b9526ea9045410e5afb70a985cplars "%s", node_name, MODE_RWX, TEST_ERRNO, 137865695bbc89088b9526ea9045410e5afb70a985cplars strerror(TEST_ERRNO)); 138865695bbc89088b9526ea9045410e5afb70a985cplars continue; 139865695bbc89088b9526ea9045410e5afb70a985cplars } 140865695bbc89088b9526ea9045410e5afb70a985cplars /* 141865695bbc89088b9526ea9045410e5afb70a985cplars * Perform functional verification if test executed 142865695bbc89088b9526ea9045410e5afb70a985cplars * without (-f) option. 143865695bbc89088b9526ea9045410e5afb70a985cplars */ 144865695bbc89088b9526ea9045410e5afb70a985cplars if (STD_FUNCTIONAL_TEST) { 145865695bbc89088b9526ea9045410e5afb70a985cplars /* Set the functionality flag */ 146865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 1; 147865695bbc89088b9526ea9045410e5afb70a985cplars 148865695bbc89088b9526ea9045410e5afb70a985cplars /* Check for node's creation */ 14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (stat(node_name, &buf) < 0) { 150865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "stat() of %s failed, errno:%d", 151865695bbc89088b9526ea9045410e5afb70a985cplars node_name, TEST_ERRNO); 152865695bbc89088b9526ea9045410e5afb70a985cplars /* unset fflag */ 153865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 154865695bbc89088b9526ea9045410e5afb70a985cplars } 155865695bbc89088b9526ea9045410e5afb70a985cplars 156865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify mode permissions of node */ 157865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_mode & S_ISGID) { 158865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "%s: Incorrect modes, setgid " 159865695bbc89088b9526ea9045410e5afb70a985cplars "bit set", node_name); 160865695bbc89088b9526ea9045410e5afb70a985cplars /* unset flag as functionality fails */ 161865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 162865695bbc89088b9526ea9045410e5afb70a985cplars } 163865695bbc89088b9526ea9045410e5afb70a985cplars 164865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify group ID of node */ 165865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_gid != group2_gid) { 166865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "%s: Incorrect group", 167865695bbc89088b9526ea9045410e5afb70a985cplars node_name); 168865695bbc89088b9526ea9045410e5afb70a985cplars /* unset flag as functionality fails */ 169865695bbc89088b9526ea9045410e5afb70a985cplars fflag = 0; 170865695bbc89088b9526ea9045410e5afb70a985cplars } 171865695bbc89088b9526ea9045410e5afb70a985cplars if (fflag) { 172865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "Functionality of mknod(%s, " 173865695bbc89088b9526ea9045410e5afb70a985cplars "%#o, 0) successful", 17456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak node_name, MODE_RWX); 175865695bbc89088b9526ea9045410e5afb70a985cplars } 176865695bbc89088b9526ea9045410e5afb70a985cplars } else { 177865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "call succeeded"); 178865695bbc89088b9526ea9045410e5afb70a985cplars } 179865695bbc89088b9526ea9045410e5afb70a985cplars 180865695bbc89088b9526ea9045410e5afb70a985cplars /* Remove the node for the next go `round */ 181865695bbc89088b9526ea9045410e5afb70a985cplars if (unlink(node_name) == -1) { 182865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TWARN, "unlink(%s) failed, errno:%d %s", 18356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak node_name, errno, strerror(errno)); 184865695bbc89088b9526ea9045410e5afb70a985cplars } 18556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 186865695bbc89088b9526ea9045410e5afb70a985cplars 187865695bbc89088b9526ea9045410e5afb70a985cplars /* Change the directory back to temporary directory */ 188865695bbc89088b9526ea9045410e5afb70a985cplars chdir(".."); 189865695bbc89088b9526ea9045410e5afb70a985cplars 190865695bbc89088b9526ea9045410e5afb70a985cplars /* 191865695bbc89088b9526ea9045410e5afb70a985cplars * Invoke cleanup() to delete the test directories created 192865695bbc89088b9526ea9045410e5afb70a985cplars * in the setup() and exit main(). 193865695bbc89088b9526ea9045410e5afb70a985cplars */ 194865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 195865695bbc89088b9526ea9045410e5afb70a985cplars 1967d0a4a57fbcd47f72b67c08df532e8ef47f6fdaeGarrett Cooper tst_exit(); 1972c28215423293e443469a07ae7011135d058b671Garrett Cooper} 198865695bbc89088b9526ea9045410e5afb70a985cplars 199865695bbc89088b9526ea9045410e5afb70a985cplars/* 2004bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * void 201865695bbc89088b9526ea9045410e5afb70a985cplars * setup(void) - performs all ONE TIME setup for this test. 20256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Exit the test program on receipt of unexpected signals. 203865695bbc89088b9526ea9045410e5afb70a985cplars * Create a temporary directory used to hold test directories created 204865695bbc89088b9526ea9045410e5afb70a985cplars * and change the directory to it. 205865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that pid of process executing the test is root. 2064bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Create a test directory on temporary directory and set the ownership 207865695bbc89088b9526ea9045410e5afb70a985cplars * of test directory to guest user and process, change mode permissions 208865695bbc89088b9526ea9045410e5afb70a985cplars * to set group-id bit on it. 209865695bbc89088b9526ea9045410e5afb70a985cplars * Set the effective uid/gid of the process to that of guest user. 210865695bbc89088b9526ea9045410e5afb70a985cplars */ 21156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 212865695bbc89088b9526ea9045410e5afb70a985cplars{ 213865695bbc89088b9526ea9045410e5afb70a985cplars 214865695bbc89088b9526ea9045410e5afb70a985cplars /* Capture unexpected signals */ 215865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(NOFORK, DEF_HANDLER, cleanup); 216865695bbc89088b9526ea9045410e5afb70a985cplars 217865695bbc89088b9526ea9045410e5afb70a985cplars /* Check that the test process id is super/root */ 218865695bbc89088b9526ea9045410e5afb70a985cplars if (geteuid() != 0) { 2194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_brkm(TBROK, NULL, "Must be super/root for this test!"); 220865695bbc89088b9526ea9045410e5afb70a985cplars tst_exit(); 221865695bbc89088b9526ea9045410e5afb70a985cplars } 222865695bbc89088b9526ea9045410e5afb70a985cplars 223865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 224865695bbc89088b9526ea9045410e5afb70a985cplars 225865695bbc89088b9526ea9045410e5afb70a985cplars /* Make a temp dir and cd to it */ 226865695bbc89088b9526ea9045410e5afb70a985cplars tst_tmpdir(); 227865695bbc89088b9526ea9045410e5afb70a985cplars 22856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* fix permissions on the tmpdir */ 22956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (chmod(".", 0711) != 0) { 23056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, cleanup, "chmod() failed"); 23156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 23205a3b8ba2534b7f3506d9b2aacad5c59a5ce5809plars 233865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the real user id of the current test process */ 23456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak save_myuid = getuid(); 235865695bbc89088b9526ea9045410e5afb70a985cplars 236865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the process id of the current test process */ 23756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak mypid = getpid(); 238865695bbc89088b9526ea9045410e5afb70a985cplars 239865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the node name to be created in the test */ 240865695bbc89088b9526ea9045410e5afb70a985cplars sprintf(node_name, TNODE, mypid); 241865695bbc89088b9526ea9045410e5afb70a985cplars 242865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the uid/gid of ltp user */ 243865695bbc89088b9526ea9045410e5afb70a985cplars if ((user1 = getpwnam(LTPUSER)) == NULL) { 244865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "%s not in /etc/passwd", LTPUSER); 245865695bbc89088b9526ea9045410e5afb70a985cplars } 246865695bbc89088b9526ea9045410e5afb70a985cplars user1_uid = user1->pw_uid; 247865695bbc89088b9526ea9045410e5afb70a985cplars group1_gid = user1->pw_gid; 248865695bbc89088b9526ea9045410e5afb70a985cplars 249865695bbc89088b9526ea9045410e5afb70a985cplars /* Get the effective group id of the test process */ 25056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak group2_gid = getegid(); 251865695bbc89088b9526ea9045410e5afb70a985cplars 252865695bbc89088b9526ea9045410e5afb70a985cplars /* 253865695bbc89088b9526ea9045410e5afb70a985cplars * Create a test directory under temporary directory with the 254865695bbc89088b9526ea9045410e5afb70a985cplars * specified mode permissions, with uid/gid set to that of guest 255865695bbc89088b9526ea9045410e5afb70a985cplars * user and the test process. 256865695bbc89088b9526ea9045410e5afb70a985cplars */ 257865695bbc89088b9526ea9045410e5afb70a985cplars if (mkdir(DIR_TEMP, MODE_RWX) < 0) { 258865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "mkdir(2) of %s failed", DIR_TEMP); 259865695bbc89088b9526ea9045410e5afb70a985cplars } 260865695bbc89088b9526ea9045410e5afb70a985cplars if (chown(DIR_TEMP, user1_uid, group2_gid) < 0) { 261865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "chown(2) of %s failed", DIR_TEMP); 262865695bbc89088b9526ea9045410e5afb70a985cplars } 263865695bbc89088b9526ea9045410e5afb70a985cplars if (chmod(DIR_TEMP, MODE_SGID) < 0) { 264865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "chmod(2) of %s failed", DIR_TEMP); 265865695bbc89088b9526ea9045410e5afb70a985cplars } 266865695bbc89088b9526ea9045410e5afb70a985cplars 267865695bbc89088b9526ea9045410e5afb70a985cplars /* 268865695bbc89088b9526ea9045410e5afb70a985cplars * Verify that test directory created with expected permission modes 269865695bbc89088b9526ea9045410e5afb70a985cplars * and ownerships. 270865695bbc89088b9526ea9045410e5afb70a985cplars */ 271865695bbc89088b9526ea9045410e5afb70a985cplars if (stat(DIR_TEMP, &buf) < 0) { 272865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "stat(2) of %s failed", DIR_TEMP); 273865695bbc89088b9526ea9045410e5afb70a985cplars } 274865695bbc89088b9526ea9045410e5afb70a985cplars 275865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify modes of test directory */ 276865695bbc89088b9526ea9045410e5afb70a985cplars if (!(buf.st_mode & S_ISGID)) { 277865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 278865695bbc89088b9526ea9045410e5afb70a985cplars "%s: Incorrect modes, setgid bit not set", DIR_TEMP); 279865695bbc89088b9526ea9045410e5afb70a985cplars } 280865695bbc89088b9526ea9045410e5afb70a985cplars 281865695bbc89088b9526ea9045410e5afb70a985cplars /* Verify group ID */ 282865695bbc89088b9526ea9045410e5afb70a985cplars if (buf.st_gid != group2_gid) { 283865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, "%s: Incorrect group", DIR_TEMP); 284865695bbc89088b9526ea9045410e5afb70a985cplars } 285bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 28656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* 2874bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Set the effective group id and user id of the test process 288865695bbc89088b9526ea9045410e5afb70a985cplars * to that of guest user (nobody) 289865695bbc89088b9526ea9045410e5afb70a985cplars */ 290865695bbc89088b9526ea9045410e5afb70a985cplars if (setgid(group1_gid) < 0) { 291865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 292865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to set process gid to that of ltp user"); 293865695bbc89088b9526ea9045410e5afb70a985cplars } 294865695bbc89088b9526ea9045410e5afb70a985cplars if (setreuid(-1, user1_uid) < 0) { 295865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 296865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to set process uid to that of ltp user"); 297865695bbc89088b9526ea9045410e5afb70a985cplars } 298865695bbc89088b9526ea9045410e5afb70a985cplars 299865695bbc89088b9526ea9045410e5afb70a985cplars /* Save the real group ID of the current process */ 300865695bbc89088b9526ea9045410e5afb70a985cplars mygid = getgid(); 301865695bbc89088b9526ea9045410e5afb70a985cplars 302865695bbc89088b9526ea9045410e5afb70a985cplars /* Change directory to DIR_TEMP */ 303865695bbc89088b9526ea9045410e5afb70a985cplars if (chdir(DIR_TEMP) < 0) { 304865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 305865695bbc89088b9526ea9045410e5afb70a985cplars "Unable to change to %s directory", DIR_TEMP); 306865695bbc89088b9526ea9045410e5afb70a985cplars } 307865695bbc89088b9526ea9045410e5afb70a985cplars} 308865695bbc89088b9526ea9045410e5afb70a985cplars 309865695bbc89088b9526ea9045410e5afb70a985cplars/* 310865695bbc89088b9526ea9045410e5afb70a985cplars * cleanup() - Performs all ONE TIME cleanup for this test at 311865695bbc89088b9526ea9045410e5afb70a985cplars * completion or premature exit. 312865695bbc89088b9526ea9045410e5afb70a985cplars * Print test timing stats and errno log if test executed with options. 313865695bbc89088b9526ea9045410e5afb70a985cplars * Restore the real/effective user id of the process changed during 314865695bbc89088b9526ea9045410e5afb70a985cplars * setup(). 315865695bbc89088b9526ea9045410e5afb70a985cplars * Remove temporary directory and sub-directories/files under it 316865695bbc89088b9526ea9045410e5afb70a985cplars * created during setup(). 317865695bbc89088b9526ea9045410e5afb70a985cplars * Exit the test program with normal exit code. 318865695bbc89088b9526ea9045410e5afb70a985cplars */ 31956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 320865695bbc89088b9526ea9045410e5afb70a985cplars{ 321865695bbc89088b9526ea9045410e5afb70a985cplars /* 322865695bbc89088b9526ea9045410e5afb70a985cplars * print timing stats if that option was specified. 323865695bbc89088b9526ea9045410e5afb70a985cplars * print errno log if that option was specified. 324865695bbc89088b9526ea9045410e5afb70a985cplars */ 325865695bbc89088b9526ea9045410e5afb70a985cplars TEST_CLEANUP; 326865695bbc89088b9526ea9045410e5afb70a985cplars 327865695bbc89088b9526ea9045410e5afb70a985cplars /* 328865695bbc89088b9526ea9045410e5afb70a985cplars * Restore the effective uid of the process changed in the 329865695bbc89088b9526ea9045410e5afb70a985cplars * setup(). 330865695bbc89088b9526ea9045410e5afb70a985cplars */ 331865695bbc89088b9526ea9045410e5afb70a985cplars if (setreuid(-1, save_myuid) < 0) { 332865695bbc89088b9526ea9045410e5afb70a985cplars tst_brkm(TBROK, cleanup, 333865695bbc89088b9526ea9045410e5afb70a985cplars "resetting process real/effective uid failed"); 334865695bbc89088b9526ea9045410e5afb70a985cplars } 335865695bbc89088b9526ea9045410e5afb70a985cplars 336865695bbc89088b9526ea9045410e5afb70a985cplars tst_rmdir(); 33756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 338ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 339