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 18705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh * 19705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh * Ported by John George 20865695bbc89088b9526ea9045410e5afb70a985cplars */ 21865695bbc89088b9526ea9045410e5afb70a985cplars 22865695bbc89088b9526ea9045410e5afb70a985cplars/* 23705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh * Test that setregid() fails and sets the proper errno values when a 24705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh * non-root user attemps to change the real or effective group id to a 25705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh * value other than the current gid or the current effective gid. 26865695bbc89088b9526ea9045410e5afb70a985cplars */ 27865695bbc89088b9526ea9045410e5afb70a985cplars 28705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh#include <errno.h> 29865695bbc89088b9526ea9045410e5afb70a985cplars#include <pwd.h> 30865695bbc89088b9526ea9045410e5afb70a985cplars#include <grp.h> 31bacc849720ec4efda5a0a8a9ea6a0e93a1415541Garrett Cooper#include <stdlib.h> 32865695bbc89088b9526ea9045410e5afb70a985cplars#include <string.h> 33705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh 34e8530df4da095b0ea36a9ff8118ab5ce906b3e84Garrett Cooper#include "test.h" 35705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh#include "compat_16.h" 36865695bbc89088b9526ea9045410e5afb70a985cplars 37705926d096f7a64c9d53efeb789288e25457d68fStanislav KholmanskikhTCID_DEFINE(setregid02); 38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 39705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikhstatic gid_t neg_one = -1; 405901ff4b9d18b497eb72630f3b5654e14cb274f0robbiew 41705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikhstatic struct passwd *ltpuser; 42705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh 438dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerovstatic struct group ltpgroup, root, bin; 44865695bbc89088b9526ea9045410e5afb70a985cplars 45865695bbc89088b9526ea9045410e5afb70a985cplars/* 46865695bbc89088b9526ea9045410e5afb70a985cplars * The following structure contains all test data. Each structure in the array 47865695bbc89088b9526ea9045410e5afb70a985cplars * is used for a separate test. The tests are executed in the for loop below. 48865695bbc89088b9526ea9045410e5afb70a985cplars */ 49865695bbc89088b9526ea9045410e5afb70a985cplars 50865695bbc89088b9526ea9045410e5afb70a985cplarsstruct test_data_t { 5156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak gid_t *real_gid; 5256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak gid_t *eff_gid; 5356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int exp_errno; 5456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct group *exp_real_usr; 5556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak struct group *exp_eff_usr; 5656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char *test_msg; 57865695bbc89088b9526ea9045410e5afb70a985cplars} test_data[] = { 5856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak { 598dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &neg_one, &root.gr_gid, EPERM, <pgroup, <pgroup, 6056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "After setregid(-1, root),"}, { 618dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &neg_one, &bin.gr_gid, EPERM, <pgroup, <pgroup, 6256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "After setregid(-1, bin)"}, { 638dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &root.gr_gid, &neg_one, EPERM, <pgroup, <pgroup, 6456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "After setregid(root,-1),"}, { 658dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &bin.gr_gid, &neg_one, EPERM, <pgroup, <pgroup, 6656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "After setregid(bin, -1),"}, { 678dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &root.gr_gid, &bin.gr_gid, EPERM, <pgroup, <pgroup, 6856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "After setregid(root, bin)"}, { 698dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov &bin.gr_gid, &root.gr_gid, EPERM, <pgroup, <pgroup, 704d1f01fed1e8200af95f8dd0b343bbfd2b4646a5Cyril Hrubis "After setregid(bin, root),"} 714d1f01fed1e8200af95f8dd0b343bbfd2b4646a5Cyril Hrubis}; 7256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 73a26e3176e52705c89f4d3256b55a39c30f3a55f0Cyril Hrubisint TST_TOTAL = ARRAY_SIZE(test_data); 7456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 75705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikhstatic void setup(void); 76705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikhstatic void gid_verify(struct group *ru, struct group *eu, char *when); 778dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerovstatic struct group get_group_by_name(const char *name); 788dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerovstatic struct group get_group_by_gid(gid_t gid); 79865695bbc89088b9526ea9045410e5afb70a985cplars 80f1ca238a510625f6fddf407badcbae5634c9678drobbiewint main(int ac, char **av) 81865695bbc89088b9526ea9045410e5afb70a985cplars{ 8289af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 83865695bbc89088b9526ea9045410e5afb70a985cplars 84d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 85865695bbc89088b9526ea9045410e5afb70a985cplars 86865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 87865695bbc89088b9526ea9045410e5afb70a985cplars 88865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 89865695bbc89088b9526ea9045410e5afb70a985cplars int i; 90865695bbc89088b9526ea9045410e5afb70a985cplars 91d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 92865695bbc89088b9526ea9045410e5afb70a985cplars 93865695bbc89088b9526ea9045410e5afb70a985cplars for (i = 0; i < TST_TOTAL; i++) { 94865695bbc89088b9526ea9045410e5afb70a985cplars /* Set the real or effective group id */ 95a26e3176e52705c89f4d3256b55a39c30f3a55f0Cyril Hrubis TEST(SETREGID(NULL, *test_data[i].real_gid, 9656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].eff_gid)); 97865695bbc89088b9526ea9045410e5afb70a985cplars 98865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN == -1) { 99865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_ERRNO == test_data[i].exp_errno) { 1001ac71c0b1779e3168a315d46411e16e10fa906beplars tst_resm(TPASS, "setregid(%d, %d) " 10156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "failed as expected.", 10256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].real_gid, 10356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].eff_gid); 104865695bbc89088b9526ea9045410e5afb70a985cplars } else { 1051ac71c0b1779e3168a315d46411e16e10fa906beplars tst_resm(TFAIL, "setregid(%d, %d) " 10656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "failed (%d) but did not set the " 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "expected errno (%d).", 10856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].real_gid, 10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].eff_gid, 11056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_ERRNO, 11156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak test_data[i].exp_errno); 112865695bbc89088b9526ea9045410e5afb70a985cplars } 113865695bbc89088b9526ea9045410e5afb70a985cplars } else { 1141ac71c0b1779e3168a315d46411e16e10fa906beplars tst_resm(TFAIL, "setregid(%d, %d) " 115923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "did not fail (ret: %ld) as expected (ret: -1).", 11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].real_gid, 11756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak *test_data[i].eff_gid, TEST_RETURN); 118865695bbc89088b9526ea9045410e5afb70a985cplars } 119e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis gid_verify(test_data[i].exp_real_usr, 120e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis test_data[i].exp_eff_usr, 121e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis test_data[i].test_msg); 122865695bbc89088b9526ea9045410e5afb70a985cplars } 123865695bbc89088b9526ea9045410e5afb70a985cplars } 124a26e3176e52705c89f4d3256b55a39c30f3a55f0Cyril Hrubis 1251e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 126865695bbc89088b9526ea9045410e5afb70a985cplars} 127865695bbc89088b9526ea9045410e5afb70a985cplars 128705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikhstatic void setup(void) 129865695bbc89088b9526ea9045410e5afb70a985cplars{ 130d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis tst_require_root(); 1312c28215423293e443469a07ae7011135d058b671Garrett Cooper 132a26e3176e52705c89f4d3256b55a39c30f3a55f0Cyril Hrubis tst_sig(FORK, DEF_HANDLER, NULL); 133865695bbc89088b9526ea9045410e5afb70a985cplars 134705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh ltpuser = getpwnam("nobody"); 135705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh if (ltpuser == NULL) 13653740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "getpwnam(\"nobody\") failed"); 137865695bbc89088b9526ea9045410e5afb70a985cplars 138705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh if (setgid(ltpuser->pw_gid) == -1) { 139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, NULL, 140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "setgid failed to set the effective gid to %d", 141705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh ltpuser->pw_gid); 14256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 143705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh if (setuid(ltpuser->pw_uid) == -1) { 144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao tst_brkm(TBROK | TERRNO, NULL, 145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao "setuid failed to to set the effective uid to %d", 146705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh ltpuser->pw_uid); 14756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 1485901ff4b9d18b497eb72630f3b5654e14cb274f0robbiew 1498dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov root = get_group_by_name("root"); 1508dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov ltpgroup = get_group_by_gid(ltpuser->pw_gid); 1518dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov bin = get_group_by_name("bin"); 152865695bbc89088b9526ea9045410e5afb70a985cplars 153865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 154865695bbc89088b9526ea9045410e5afb70a985cplars} 155865695bbc89088b9526ea9045410e5afb70a985cplars 1568dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerovstatic struct group get_group_by_name(const char *name) 1578dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov{ 1588dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov struct group *ret = getgrnam(name); 1598dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1608dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov if (ret == NULL) 1618dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov tst_brkm(TBROK|TERRNO, NULL, "getgrnam(\"%s\") failed", name); 1628dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1638dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov GID16_CHECK(ret->gr_gid, setregid, NULL); 1648dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1658dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov return *ret; 1668dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov} 1678dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1688dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerovstatic struct group get_group_by_gid(gid_t gid) 1698dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov{ 1708dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov struct group *ret = getgrgid(gid); 1718dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1728dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov if (ret == NULL) 1738dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov tst_brkm(TBROK|TERRNO, NULL, "getgrgid(\"%d\") failed", gid); 1748dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1758dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov GID16_CHECK(ret->gr_gid, setregid, NULL); 1768dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 1778dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov return *ret; 1788dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov} 1798dc242ae6b48e02627a5650b6b6f11c42c254bc6Yuriy Kolerov 18056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid gid_verify(struct group *rg, struct group *eg, char *when) 181865695bbc89088b9526ea9045410e5afb70a985cplars{ 182865695bbc89088b9526ea9045410e5afb70a985cplars if ((getgid() != rg->gr_gid) || (getegid() != eg->gr_gid)) { 183705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh tst_resm(TFAIL, "ERROR: %s real gid = %d; effective gid = %d", 184865695bbc89088b9526ea9045410e5afb70a985cplars when, getgid(), getegid()); 185865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TINFO, "Expected: real gid = %d; effective gid = %d", 186865695bbc89088b9526ea9045410e5afb70a985cplars rg->gr_gid, eg->gr_gid); 187705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh } else { 188705926d096f7a64c9d53efeb789288e25457d68fStanislav Kholmanskikh tst_resm(TPASS, "real or effective gid was modified as expected"); 189865695bbc89088b9526ea9045410e5afb70a985cplars } 190bacc849720ec4efda5a0a8a9ea6a0e93a1415541Garrett Cooper} 191