setresgid03.c revision 75fb057ebd66c8d8012ec5a53f1a187551296b00
16f906eab90659aa74fbd44d545e276c56362f43frobbiew/* 26f906eab90659aa74fbd44d545e276c56362f43frobbiew * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. 36f906eab90659aa74fbd44d545e276c56362f43frobbiew * 46f906eab90659aa74fbd44d545e276c56362f43frobbiew * This program is free software; you can redistribute it and/or modify it 56f906eab90659aa74fbd44d545e276c56362f43frobbiew * under the terms of version 2 of the GNU General Public License as 66f906eab90659aa74fbd44d545e276c56362f43frobbiew * published by the Free Software Foundation. 76f906eab90659aa74fbd44d545e276c56362f43frobbiew * 86f906eab90659aa74fbd44d545e276c56362f43frobbiew * This program is distributed in the hope that it would be useful, but 96f906eab90659aa74fbd44d545e276c56362f43frobbiew * WITHOUT ANY WARRANTY; without even the implied warranty of 106f906eab90659aa74fbd44d545e276c56362f43frobbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 116f906eab90659aa74fbd44d545e276c56362f43frobbiew * 126f906eab90659aa74fbd44d545e276c56362f43frobbiew * You should have received a copy of the GNU General Public License along 13fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * with this program; if not, write the Free Software Foundation, Inc., 14fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 156f906eab90659aa74fbd44d545e276c56362f43frobbiew * 166f906eab90659aa74fbd44d545e276c56362f43frobbiew */ 176f906eab90659aa74fbd44d545e276c56362f43frobbiew/********************************************************** 184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 196f906eab90659aa74fbd44d545e276c56362f43frobbiew * TEST IDENTIFIER : setresgid03 204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 216f906eab90659aa74fbd44d545e276c56362f43frobbiew * EXECUTED BY : root / superuser 224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 236f906eab90659aa74fbd44d545e276c56362f43frobbiew * TEST TITLE : Checking error conditions for setresgid(2) 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 256f906eab90659aa74fbd44d545e276c56362f43frobbiew * TEST CASE TOTAL : 4 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 276f906eab90659aa74fbd44d545e276c56362f43frobbiew * AUTHOR : Madhu T L <madhu.tarikere@wipro.com> 284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 296f906eab90659aa74fbd44d545e276c56362f43frobbiew * SIGNALS 306f906eab90659aa74fbd44d545e276c56362f43frobbiew * Uses SIGUSR1 to pause before test if option set. 316f906eab90659aa74fbd44d545e276c56362f43frobbiew * (See the parse_opts(3) man page). 326f906eab90659aa74fbd44d545e276c56362f43frobbiew * 336f906eab90659aa74fbd44d545e276c56362f43frobbiew * DESCRIPTION 346f906eab90659aa74fbd44d545e276c56362f43frobbiew * Verify that, 356f906eab90659aa74fbd44d545e276c56362f43frobbiew * 1. setresgid(2) fails with EPERM for unprivileged user in setting 366f906eab90659aa74fbd44d545e276c56362f43frobbiew * saved group id. 376f906eab90659aa74fbd44d545e276c56362f43frobbiew * 2. setresgid(2) fails with EPERM for unprivileged user in setting 386f906eab90659aa74fbd44d545e276c56362f43frobbiew * effective group id. 396f906eab90659aa74fbd44d545e276c56362f43frobbiew * 3. setresgid(2) fails with EPERM for unprivileged user in setting 406f906eab90659aa74fbd44d545e276c56362f43frobbiew * real group id. 416f906eab90659aa74fbd44d545e276c56362f43frobbiew * 4. setresgid(2) fails with EPERM for unprivileged user in setting 426f906eab90659aa74fbd44d545e276c56362f43frobbiew * real/effective/saved group id. 434bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 446f906eab90659aa74fbd44d545e276c56362f43frobbiew * Setup: 456f906eab90659aa74fbd44d545e276c56362f43frobbiew * Setup signal handling. 466f906eab90659aa74fbd44d545e276c56362f43frobbiew * Test caller is superuser 476f906eab90659aa74fbd44d545e276c56362f43frobbiew * Check existence of user id's root/bin/nobody 486f906eab90659aa74fbd44d545e276c56362f43frobbiew * Set real/effective/saved gid to nobody 496f906eab90659aa74fbd44d545e276c56362f43frobbiew * Set effective uid to nobody 506f906eab90659aa74fbd44d545e276c56362f43frobbiew * Pause for SIGUSR1 if option specified. 514bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 526f906eab90659aa74fbd44d545e276c56362f43frobbiew * Test: 536f906eab90659aa74fbd44d545e276c56362f43frobbiew * Loop if the proper options are given. 546f906eab90659aa74fbd44d545e276c56362f43frobbiew * Execute system call 556f906eab90659aa74fbd44d545e276c56362f43frobbiew * Check return value, errno and functionality, if success, 566f906eab90659aa74fbd44d545e276c56362f43frobbiew * Issue PASS message 576f906eab90659aa74fbd44d545e276c56362f43frobbiew * Otherwise, 586f906eab90659aa74fbd44d545e276c56362f43frobbiew * Issue FAIL message 594bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 606f906eab90659aa74fbd44d545e276c56362f43frobbiew * Cleanup: 616f906eab90659aa74fbd44d545e276c56362f43frobbiew * Print errno log and/or timing stats if options given 624bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 636f906eab90659aa74fbd44d545e276c56362f43frobbiew * USAGE: <for command-line> 646f906eab90659aa74fbd44d545e276c56362f43frobbiew * setresgid03 [-c n] [-e] [-f] [-h] [-i n] [-I x] [-p] [-P x] [-t] 656f906eab90659aa74fbd44d545e276c56362f43frobbiew * where, -c n : Run n copies concurrently. 666f906eab90659aa74fbd44d545e276c56362f43frobbiew * -e : Turn on errno logging. 676f906eab90659aa74fbd44d545e276c56362f43frobbiew * -f : Turn off functional testing 686f906eab90659aa74fbd44d545e276c56362f43frobbiew * -h : Show help screen 696f906eab90659aa74fbd44d545e276c56362f43frobbiew * -i n : Execute test n times. 706f906eab90659aa74fbd44d545e276c56362f43frobbiew * -I x : Execute test for x seconds. 716f906eab90659aa74fbd44d545e276c56362f43frobbiew * -p : Pause for SIGUSR1 before starting 726f906eab90659aa74fbd44d545e276c56362f43frobbiew * -P x : Pause for x seconds between iterations. 736f906eab90659aa74fbd44d545e276c56362f43frobbiew * -t : Turn on syscall timing. 744bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 756f906eab90659aa74fbd44d545e276c56362f43frobbiew ****************************************************************/ 766f906eab90659aa74fbd44d545e276c56362f43frobbiew 77bed036a06374f3abca1c7cc3d246b1ed141c1a84vapier#define _GNU_SOURCE 1 786f906eab90659aa74fbd44d545e276c56362f43frobbiew#include <errno.h> 796f906eab90659aa74fbd44d545e276c56362f43frobbiew#include <pwd.h> 806f906eab90659aa74fbd44d545e276c56362f43frobbiew#include <sys/types.h> 816f906eab90659aa74fbd44d545e276c56362f43frobbiew#include <unistd.h> 826f906eab90659aa74fbd44d545e276c56362f43frobbiew#include "test.h" 836f906eab90659aa74fbd44d545e276c56362f43frobbiew#include "usctest.h" 8475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian#include "compat_16.h" 856f906eab90659aa74fbd44d545e276c56362f43frobbiew 866f906eab90659aa74fbd44d545e276c56362f43frobbiew#define EXP_RET_VAL -1 876f906eab90659aa74fbd44d545e276c56362f43frobbiew#define EXP_ERRNO EPERM 886f906eab90659aa74fbd44d545e276c56362f43frobbiew#define TEST_DESC "unprivileged user" 896f906eab90659aa74fbd44d545e276c56362f43frobbiew 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstruct test_case_t { /* test case structure */ 9156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid_t *rgid; /* real GID */ 9256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid_t *egid; /* effective GID */ 9356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid_t *sgid; /* saved GID */ 946f906eab90659aa74fbd44d545e276c56362f43frobbiew struct passwd *exp_rgid; /* Expected real GID */ 956f906eab90659aa74fbd44d545e276c56362f43frobbiew struct passwd *exp_egid; /* Expected effective GID */ 966f906eab90659aa74fbd44d545e276c56362f43frobbiew struct passwd *exp_sgid; /* Expected saved GID */ 976f906eab90659aa74fbd44d545e276c56362f43frobbiew}; 986f906eab90659aa74fbd44d545e276c56362f43frobbiew 9975fb057ebd66c8d8012ec5a53f1a187551296b00Han PingtianTCID_DEFINE(setresgid03); 1006f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic int testno; 1016f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic struct passwd nobody, bin, root; 1026f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic uid_t nobody_gid, bin_gid, neg = -1; 10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic int exp_enos[] = { EPERM, 0 }; 1046f906eab90659aa74fbd44d545e276c56362f43frobbiew 1056f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic int test_functionality(uid_t, uid_t, uid_t); 1066f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic void setup(void); 1076f906eab90659aa74fbd44d545e276c56362f43frobbiewstatic void cleanup(void); 1086f906eab90659aa74fbd44d545e276c56362f43frobbiew 10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic struct test_case_t tdat[] = { 11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak {&neg, &neg, &bin.pw_gid, &nobody, &nobody, &nobody}, 11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak {&neg, &bin.pw_gid, &neg, &nobody, &nobody, &nobody}, 11256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak {&bin.pw_gid, &neg, &neg, &nobody, &nobody, &nobody}, 11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak {&bin.pw_gid, &bin.pw_gid, &bin.pw_gid, &nobody, &nobody, &nobody}, 1146f906eab90659aa74fbd44d545e276c56362f43frobbiew}; 1156f906eab90659aa74fbd44d545e276c56362f43frobbiew 1166f906eab90659aa74fbd44d545e276c56362f43frobbiewint TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); 1176f906eab90659aa74fbd44d545e276c56362f43frobbiew 11856207cec7732e09c216c751c0b5f88a242bacae6subrata_modakint main(int argc, char **argv) 1196f906eab90659aa74fbd44d545e276c56362f43frobbiew{ 12089af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 1210b9589f3f9c0345b29cfcf7da5a1253c708303ebCyril Hrubis const char *msg; 1226f906eab90659aa74fbd44d545e276c56362f43frobbiew 123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao if ((msg = parse_opts(argc, argv, NULL, NULL)) != NULL) { 12460fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 1256f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1266f906eab90659aa74fbd44d545e276c56362f43frobbiew 1276f906eab90659aa74fbd44d545e276c56362f43frobbiew setup(); 1286f906eab90659aa74fbd44d545e276c56362f43frobbiew 1296f906eab90659aa74fbd44d545e276c56362f43frobbiew for (lc = 0; TEST_LOOPING(lc); lc++) { 130d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 131d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 1326f906eab90659aa74fbd44d545e276c56362f43frobbiew 1336f906eab90659aa74fbd44d545e276c56362f43frobbiew for (testno = 0; testno < TST_TOTAL; ++testno) { 1346f906eab90659aa74fbd44d545e276c56362f43frobbiew 13575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian TEST(SETRESGID(cleanup, *tdat[testno].rgid, *tdat[testno].egid, 13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *tdat[testno].sgid)); 1376f906eab90659aa74fbd44d545e276c56362f43frobbiew 1386f906eab90659aa74fbd44d545e276c56362f43frobbiew TEST_ERROR_LOG(TEST_ERRNO); 13956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((TEST_RETURN == EXP_RET_VAL) && 14056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (TEST_ERRNO == EXP_ERRNO)) { 1416f906eab90659aa74fbd44d545e276c56362f43frobbiew 14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (!test_functionality 14356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak (tdat[testno].exp_rgid->pw_gid, 14456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].exp_egid->pw_gid, 14556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tdat[testno].exp_sgid->pw_gid)) { 1466f906eab90659aa74fbd44d545e276c56362f43frobbiew 1476f906eab90659aa74fbd44d545e276c56362f43frobbiew tst_resm(TPASS, "setresgid() failed as " 14856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "expected for %s : errno %d", 14956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_DESC, TEST_ERRNO); 1506f906eab90659aa74fbd44d545e276c56362f43frobbiew } else { 1516f906eab90659aa74fbd44d545e276c56362f43frobbiew tst_resm(TFAIL, "Functionality test " 15256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "for setresgid() for %s failed", 15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_DESC); 1546f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1556f906eab90659aa74fbd44d545e276c56362f43frobbiew 1566f906eab90659aa74fbd44d545e276c56362f43frobbiew } else { 1576f906eab90659aa74fbd44d545e276c56362f43frobbiew tst_resm(TFAIL, "setresgid() returned " 15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "unexpected results for %s ; returned" 159b0b6f454a93242fc457249b6a22b7118c5479bf3vapier " %ld (expected %d), errno %d (expected" 160b0b6f454a93242fc457249b6a22b7118c5479bf3vapier " %d)", TEST_DESC, 16156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_RETURN, EXP_RET_VAL, TEST_ERRNO, 16256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak EXP_ERRNO); 1636f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1646f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1656f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1666f906eab90659aa74fbd44d545e276c56362f43frobbiew cleanup(); 1676f906eab90659aa74fbd44d545e276c56362f43frobbiew 16853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_exit(); 1696f906eab90659aa74fbd44d545e276c56362f43frobbiew} 1706f906eab90659aa74fbd44d545e276c56362f43frobbiew 17156207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic int test_functionality(uid_t exp_rgid, uid_t exp_egid, uid_t exp_sgid) 1726f906eab90659aa74fbd44d545e276c56362f43frobbiew{ 1736f906eab90659aa74fbd44d545e276c56362f43frobbiew uid_t cur_rgid, cur_egid, cur_sgid; 1746f906eab90659aa74fbd44d545e276c56362f43frobbiew 1756f906eab90659aa74fbd44d545e276c56362f43frobbiew /* Get current real, effective and saved group id */ 17656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (getresgid(&cur_rgid, &cur_egid, &cur_sgid) == -1) { 1776f906eab90659aa74fbd44d545e276c56362f43frobbiew tst_brkm(TBROK, cleanup, "getresgid() failed"); 1782c28215423293e443469a07ae7011135d058b671Garrett Cooper 1796f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1806f906eab90659aa74fbd44d545e276c56362f43frobbiew 18156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((cur_rgid == exp_rgid) && (cur_egid == exp_egid) 18256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak && (cur_sgid == exp_sgid)) { 1836f906eab90659aa74fbd44d545e276c56362f43frobbiew return 0; 1846f906eab90659aa74fbd44d545e276c56362f43frobbiew } 1856f906eab90659aa74fbd44d545e276c56362f43frobbiew return 1; 1866f906eab90659aa74fbd44d545e276c56362f43frobbiew} 1876f906eab90659aa74fbd44d545e276c56362f43frobbiew 1886f906eab90659aa74fbd44d545e276c56362f43frobbiew/* 1896f906eab90659aa74fbd44d545e276c56362f43frobbiew * setup() 1906f906eab90659aa74fbd44d545e276c56362f43frobbiew * performs all ONE TIME setup for this test 1916f906eab90659aa74fbd44d545e276c56362f43frobbiew */ 19256207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup(void) 1936f906eab90659aa74fbd44d545e276c56362f43frobbiew{ 1946f906eab90659aa74fbd44d545e276c56362f43frobbiew struct passwd *passwd_p; 1956f906eab90659aa74fbd44d545e276c56362f43frobbiew 196d4ceb37d3ab506483612ef0ad74c88e5828a9779Nicolas Joly tst_require_root(NULL); 1976f906eab90659aa74fbd44d545e276c56362f43frobbiew 198d4ceb37d3ab506483612ef0ad74c88e5828a9779Nicolas Joly tst_sig(NOFORK, DEF_HANDLER, cleanup); 1996f906eab90659aa74fbd44d545e276c56362f43frobbiew 20056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((passwd_p = getpwnam("root")) == NULL) { 20153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "getpwnam() failed for root"); 2022c28215423293e443469a07ae7011135d058b671Garrett Cooper 2036f906eab90659aa74fbd44d545e276c56362f43frobbiew } 2046f906eab90659aa74fbd44d545e276c56362f43frobbiew root = *passwd_p; 2056f906eab90659aa74fbd44d545e276c56362f43frobbiew 20656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((passwd_p = getpwnam("bin")) == NULL) { 20753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "bin user id doesn't exist"); 2082c28215423293e443469a07ae7011135d058b671Garrett Cooper 2096f906eab90659aa74fbd44d545e276c56362f43frobbiew } 2106f906eab90659aa74fbd44d545e276c56362f43frobbiew bin = *passwd_p; 21175fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian GID16_CHECK((bin_gid = bin.pw_gid), "setresgid", cleanup) 2126f906eab90659aa74fbd44d545e276c56362f43frobbiew 21356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if ((passwd_p = getpwnam("nobody")) == NULL) { 21453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "nobody user id doesn't exist"); 2152c28215423293e443469a07ae7011135d058b671Garrett Cooper 2166f906eab90659aa74fbd44d545e276c56362f43frobbiew } 2176f906eab90659aa74fbd44d545e276c56362f43frobbiew nobody = *passwd_p; 21875fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian GID16_CHECK((nobody_gid = nobody.pw_gid), "setresgid", cleanup) 2196f906eab90659aa74fbd44d545e276c56362f43frobbiew 2206f906eab90659aa74fbd44d545e276c56362f43frobbiew /* set the expected errnos... */ 2216f906eab90659aa74fbd44d545e276c56362f43frobbiew TEST_EXP_ENOS(exp_enos); 2226f906eab90659aa74fbd44d545e276c56362f43frobbiew 2236f906eab90659aa74fbd44d545e276c56362f43frobbiew /* Set real/effective/saved gid to nobody */ 22456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setresgid(nobody_gid, nobody_gid, nobody_gid) == -1) { 22553740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "setup() failed for setting while" 22656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak " setting real/effective/saved gid"); 2272c28215423293e443469a07ae7011135d058b671Garrett Cooper 2286f906eab90659aa74fbd44d545e276c56362f43frobbiew } 2296f906eab90659aa74fbd44d545e276c56362f43frobbiew /* Set euid to nobody */ 2306f906eab90659aa74fbd44d545e276c56362f43frobbiew if (setuid(nobody.pw_uid) == -1) { 23153740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "setuid failed to " 23256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to nodody"); 2332c28215423293e443469a07ae7011135d058b671Garrett Cooper 2346f906eab90659aa74fbd44d545e276c56362f43frobbiew } 2356f906eab90659aa74fbd44d545e276c56362f43frobbiew /* Pause if that option was specified 2366f906eab90659aa74fbd44d545e276c56362f43frobbiew * TEST_PAUSE contains the code to fork the test with the -c option. 2376f906eab90659aa74fbd44d545e276c56362f43frobbiew */ 2386f906eab90659aa74fbd44d545e276c56362f43frobbiew TEST_PAUSE; 2396f906eab90659aa74fbd44d545e276c56362f43frobbiew} 2406f906eab90659aa74fbd44d545e276c56362f43frobbiew 2416f906eab90659aa74fbd44d545e276c56362f43frobbiew/* 2426f906eab90659aa74fbd44d545e276c56362f43frobbiew * cleanup() 2436f906eab90659aa74fbd44d545e276c56362f43frobbiew * performs all ONE TIME cleanup for this test at 2446f906eab90659aa74fbd44d545e276c56362f43frobbiew * completion or premature exit 2456f906eab90659aa74fbd44d545e276c56362f43frobbiew */ 24656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup(void) 2476f906eab90659aa74fbd44d545e276c56362f43frobbiew{ 2486f906eab90659aa74fbd44d545e276c56362f43frobbiew /* 2496f906eab90659aa74fbd44d545e276c56362f43frobbiew * print timing stats if that option was specified. 2506f906eab90659aa74fbd44d545e276c56362f43frobbiew * print errno log if that option was specified. 2516f906eab90659aa74fbd44d545e276c56362f43frobbiew */ 2526f906eab90659aa74fbd44d545e276c56362f43frobbiew 2536f906eab90659aa74fbd44d545e276c56362f43frobbiew TEST_CLEANUP; 2546f906eab90659aa74fbd44d545e276c56362f43frobbiew 255354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 256