ctest: Move to new dashboard
[uid_wrapper.git] / tests / test_setegid.c
1 #include "config.h"
2
3 #include <stdarg.h>
4 #include <stddef.h>
5 #include <setjmp.h>
6 #include <cmocka.h>
7
8 #include <sys/types.h>
9 #include <unistd.h>
10 #include <errno.h>
11
12 #include <pwd.h>
13
14 static void test_uwrap_setegid_root(void **state)
15 {
16         int rc;
17         gid_t u;
18         gid_t g;
19 #ifdef HAVE_GETRESGID
20         gid_t cp_rgid, cp_egid, cp_sgid;
21 #endif
22
23         (void) state; /* unused */
24
25         u = getuid();
26         assert_int_equal(u, 0x0);
27         u = geteuid();
28         assert_int_equal(u, 0x0);
29
30 #ifdef HAVE_GETRESGID
31         cp_rgid = cp_egid = cp_sgid = -1;
32         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
33         assert_return_code(rc, errno);
34         assert_int_equal(cp_rgid, 0);
35         assert_int_equal(cp_egid, 0);
36         assert_int_equal(cp_sgid, 0);
37 #endif
38
39         g = getgid();
40         assert_int_equal(g, 0x0);
41
42         g = getegid();
43         assert_int_equal(g, 0x0);
44
45         rc = setegid(-1);
46         assert_int_equal(rc, -1);
47         assert_int_equal(errno, EINVAL);
48
49         rc = setegid(0x4444);
50         assert_return_code(rc, errno);
51
52 #ifdef HAVE_GETRESGID
53         cp_rgid = cp_egid = cp_sgid = -1;
54         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
55         assert_return_code(rc, errno);
56         assert_int_equal(cp_rgid, 0);
57         assert_int_equal(cp_egid, 0x4444);
58         assert_int_equal(cp_sgid, 0);
59 #endif
60
61         g = getegid();
62         assert_int_equal(g, 0x4444);
63
64         rc = setegid(0);
65         assert_int_equal(rc, 0);
66
67 #ifdef HAVE_GETRESGID
68         cp_rgid = cp_egid = cp_sgid = -1;
69         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
70         assert_return_code(rc, errno);
71         assert_int_equal(cp_rgid, 0);
72         assert_int_equal(cp_egid, 0);
73         assert_int_equal(cp_sgid, 0);
74 #endif
75
76         g = getegid();
77         assert_int_equal(g, 0);
78
79         rc = setegid(0x5555);
80         assert_return_code(rc, errno);
81
82 #ifdef HAVE_GETRESGID
83         cp_rgid = cp_egid = cp_sgid = -1;
84         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
85         assert_return_code(rc, errno);
86         assert_int_equal(cp_rgid, 0);
87         assert_int_equal(cp_egid, 0x5555);
88         assert_int_equal(cp_sgid, 0);
89 #endif
90
91         g = getegid();
92         assert_int_equal(g, 0x5555);
93
94         rc = setegid(0);
95         assert_return_code(rc, errno);
96 }
97
98 static void test_uwrap_setegid_user(void **state)
99 {
100         int rc;
101         uid_t u;
102 #ifdef HAVE_GETRESGID
103         gid_t cp_rgid, cp_egid, cp_sgid;
104 #endif
105
106         (void) state; /* unused */
107
108         u = getuid();
109         assert_int_equal(u, 0x0);
110         u = geteuid();
111         assert_int_equal(u, 0x0);
112
113 #ifdef HAVE_GETRESGID
114         cp_rgid = cp_egid = cp_sgid = -1;
115         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
116         assert_return_code(rc, errno);
117         assert_int_equal(cp_rgid, 0);
118         assert_int_equal(cp_egid, 0);
119         assert_int_equal(cp_sgid, 0);
120 #endif
121
122         rc = setuid(0x5555);
123         assert_return_code(rc, errno);
124
125         u = getuid();
126         assert_int_equal(u, 0x5555);
127         u = geteuid();
128         assert_int_equal(u, 0x5555);
129
130 #ifdef HAVE_GETRESGID
131         cp_rgid = cp_egid = cp_sgid = -1;
132         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
133         assert_return_code(rc, errno);
134         assert_int_equal(cp_rgid, 0);
135         assert_int_equal(cp_egid, 0);
136         assert_int_equal(cp_sgid, 0);
137 #endif
138
139         rc = setegid(0x4444);
140         assert_int_equal(rc, -1);
141         assert_int_equal(errno, EPERM);
142
143 #ifdef HAVE_GETRESGID
144         cp_rgid = cp_egid = cp_sgid = -1;
145         rc = getresgid(&cp_rgid, &cp_egid, &cp_sgid);
146         assert_return_code(rc, errno);
147         assert_int_equal(cp_rgid, 0);
148         assert_int_equal(cp_egid, 0);
149         assert_int_equal(cp_sgid, 0);
150 #endif
151
152         rc = setegid(0);
153         assert_return_code(rc, errno);
154 }
155
156 int main(void) {
157         int rc;
158
159         const struct CMUnitTest uwrap_tests[] = {
160                 cmocka_unit_test(test_uwrap_setegid_root),
161                 cmocka_unit_test(test_uwrap_setegid_user),
162         };
163
164         rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
165
166         return rc;
167 }