blob: b9426ab79257fb76d339b6dbd9e872ea47b3ec85 [file] [log] [blame]
plars865695b2001-08-27 22:15:12 +00001/*
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +04002 * Copyright (c) International Business Machines Corp., 2001
plars865695b2001-08-27 22:15:12 +00003 *
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +04004 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
plars865695b2001-08-27 22:15:12 +00008 *
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +04009 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12 * the GNU General Public License for more details.
plars865695b2001-08-27 22:15:12 +000013 *
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040014 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
plars865695b2001-08-27 22:15:12 +000017 *
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040018 * Ported by John George
plars865695b2001-08-27 22:15:12 +000019 */
20
21/*
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040022 * Test setregid() when executed by root.
plars865695b2001-08-27 22:15:12 +000023 */
24
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040025#include <errno.h>
plars865695b2001-08-27 22:15:12 +000026#include <pwd.h>
27#include <grp.h>
Garrett Cooperbacc8492011-01-14 00:36:17 -080028#include <stdlib.h>
plars865695b2001-08-27 22:15:12 +000029#include <string.h>
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040030
Garrett Coopere8530df2010-12-21 11:37:57 -080031#include "test.h"
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040032#include "compat_16.h"
plars865695b2001-08-27 22:15:12 +000033
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040034TCID_DEFINE(setregid04);
plars865695b2001-08-27 22:15:12 +000035
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040036static gid_t neg_one = -1;
37
38static struct group users_gr, daemon_gr, root_gr, bin_gr;
plars865695b2001-08-27 22:15:12 +000039
40/*
41 * The following structure contains all test data. Each structure in the array
42 * is used for a separate test. The tests are executed in the for loop below.
43 */
44
45struct test_data_t {
subrata_modak56207ce2009-03-23 13:35:39 +000046 gid_t *real_gid;
47 gid_t *eff_gid;
48 struct group *exp_real_usr;
49 struct group *exp_eff_usr;
yaberauneya09536322009-11-14 10:12:29 +000050 const char *test_msg;
plars865695b2001-08-27 22:15:12 +000051} test_data[] = {
subrata_modak56207ce2009-03-23 13:35:39 +000052 {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040053 &root_gr.gr_gid, &root_gr.gr_gid, &root_gr, &root_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080054 "After setregid(root, root),"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040055 &users_gr.gr_gid, &neg_one, &users_gr, &root_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080056 "After setregid(users, -1)"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040057 &root_gr.gr_gid, &neg_one, &root_gr, &root_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080058 "After setregid(root,-1),"}, {
59 &neg_one, &neg_one, &root_gr, &root_gr,
60 "After setregid(-1, -1),"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040061 &neg_one, &root_gr.gr_gid, &root_gr, &root_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080062 "After setregid(-1, root)"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040063 &root_gr.gr_gid, &neg_one, &root_gr, &root_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080064 "After setregid(root, -1),"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040065 &daemon_gr.gr_gid, &users_gr.gr_gid, &daemon_gr, &users_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080066 "After setregid(daemon, users)"}, {
67 &neg_one, &neg_one, &daemon_gr, &users_gr,
68 "After setregid(-1, -1)"}, {
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040069 &neg_one, &users_gr.gr_gid, &daemon_gr, &users_gr,
Wanlong Gao354ebb42012-12-07 10:10:04 +080070 "After setregid(-1, users)"}
yaberauneya09536322009-11-14 10:12:29 +000071};
plars865695b2001-08-27 22:15:12 +000072
subrata_modak56207ce2009-03-23 13:35:39 +000073int TST_TOTAL = sizeof(test_data) / sizeof(test_data[0]);
plars865695b2001-08-27 22:15:12 +000074
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040075static void setup(void);
76static void cleanup(void);
77static void gid_verify(struct group *ru, struct group *eu, const char *when);
plars865695b2001-08-27 22:15:12 +000078
robbiewf1ca2382003-03-27 20:28:50 +000079int main(int ac, char **av)
plars865695b2001-08-27 22:15:12 +000080{
Cyril Hrubis89af32a2012-10-24 16:39:11 +020081 int lc;
Cyril Hrubis0b9589f2014-05-27 17:40:33 +020082 const char *msg;
plars865695b2001-08-27 22:15:12 +000083
Garrett Cooper53740502010-12-16 00:04:01 -080084 if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
plars865695b2001-08-27 22:15:12 +000085 tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
plars865695b2001-08-27 22:15:12 +000086
plars865695b2001-08-27 22:15:12 +000087 setup();
88
plars865695b2001-08-27 22:15:12 +000089 for (lc = 0; TEST_LOOPING(lc); lc++) {
90 int i;
91
Caspar Zhangd59a6592013-03-07 14:59:12 +080092 tst_count = 0;
plars865695b2001-08-27 22:15:12 +000093
94 for (i = 0; i < TST_TOTAL; i++) {
95 /* Set the real or effective group id */
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +040096 TEST(SETREGID(cleanup, *test_data[i].real_gid,
subrata_modak56207ce2009-03-23 13:35:39 +000097 *test_data[i].eff_gid));
plars865695b2001-08-27 22:15:12 +000098
99 if (TEST_RETURN == -1) {
plars865695b2001-08-27 22:15:12 +0000100 tst_resm(TBROK, "setregid(%d, %d) failed",
subrata_modak923b23f2009-11-02 13:57:16 +0000101 *test_data[i].real_gid,
102 *test_data[i].eff_gid);
plars865695b2001-08-27 22:15:12 +0000103 } else {
Cyril Hrubise38b9612014-06-02 17:20:57 +0200104 gid_verify(test_data[i].exp_real_usr,
105 test_data[i].exp_eff_usr,
106 test_data[i].test_msg);
plars865695b2001-08-27 22:15:12 +0000107 }
108 }
109 }
Garrett Cooper685b8e72010-11-22 13:23:01 -0800110
plars865695b2001-08-27 22:15:12 +0000111 cleanup();
Garrett Cooper1e6f5a62010-12-19 09:58:10 -0800112 tst_exit();
plars865695b2001-08-27 22:15:12 +0000113}
114
yaberauneya09536322009-11-14 10:12:29 +0000115#define SAFE_GETGROUP(GROUPNAME) \
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +0400116 if (getgrnam(#GROUPNAME) == NULL) { \
yaberauneya09536322009-11-14 10:12:29 +0000117 tst_brkm(TBROK, NULL, "Couldn't find the `" #GROUPNAME "' group"); \
yaberauneya09536322009-11-14 10:12:29 +0000118 } \
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +0400119 GROUPNAME ## _gr = *(getgrnam(#GROUPNAME));
yaberauneya09536322009-11-14 10:12:29 +0000120
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +0400121static void setup(void)
plars865695b2001-08-27 22:15:12 +0000122{
Garrett Cooper685b8e72010-11-22 13:23:01 -0800123 tst_require_root(NULL);
124
plars865695b2001-08-27 22:15:12 +0000125 tst_sig(FORK, DEF_HANDLER, cleanup);
126
yaberauneya09536322009-11-14 10:12:29 +0000127 SAFE_GETGROUP(root);
128 SAFE_GETGROUP(users);
129 SAFE_GETGROUP(daemon);
130 SAFE_GETGROUP(bin);
plars865695b2001-08-27 22:15:12 +0000131
plars865695b2001-08-27 22:15:12 +0000132 TEST_PAUSE;
133}
134
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +0400135static void cleanup(void)
plars865695b2001-08-27 22:15:12 +0000136{
yaberauneya09536322009-11-14 10:12:29 +0000137}
plars865695b2001-08-27 22:15:12 +0000138
Stanislav Kholmanskikhde8b8db2013-10-21 11:25:16 +0400139static void gid_verify(struct group *rg, struct group *eg, const char *when)
plars865695b2001-08-27 22:15:12 +0000140{
141 if ((getgid() != rg->gr_gid) || (getegid() != eg->gr_gid)) {
142 tst_resm(TFAIL, "ERROR: %s real gid = %d; effective gid = %d",
143 when, getgid(), getegid());
144 tst_resm(TINFO, "Expected: real gid = %d; effective gid = %d",
145 rg->gr_gid, eg->gr_gid);
146 } else {
147 tst_resm(TPASS, "real or effective gid was modified as "
subrata_modak56207ce2009-03-23 13:35:39 +0000148 "expected");
plars865695b2001-08-27 22:15:12 +0000149 }
Garrett Cooperbacc8492011-01-14 00:36:17 -0800150}