uwrap: Fix build on Solaris.
[obnox/cwrap/uid_wrapper.git] / tests / testsuite.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 <errno.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <unistd.h>
15
16 #ifdef HAVE_SYS_SYSCALL_H
17 #include <sys/syscall.h>
18 #endif
19 #ifdef HAVE_SYSCALL_H
20 #include <syscall.h>
21 #endif
22
23 static void test_uwrap_seteuid(void **state)
24 {
25         int rc;
26         uid_t u;
27         char *env;
28
29         env = getenv("UID_WRAPPER");
30         if (env == NULL) {
31                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
32                 return;
33         }
34
35         (void) state; /* unused */
36
37         rc = seteuid(-1);
38         assert_int_equal(rc, -1);
39
40         rc = seteuid(0);
41         assert_int_equal(rc, 0);
42
43         u = geteuid();
44 #ifdef SYS_geteuid /* not available on Solaris */
45         assert_int_equal(u, syscall(SYS_geteuid));
46 #endif
47
48         rc = setuid(42);
49         assert_int_equal(rc, 0);
50
51         u = getuid();
52         assert_int_equal(u, 42);
53 }
54
55 static void test_uwrap_setuid(void **state)
56 {
57         int rc;
58         uid_t u;
59         char *env;
60
61         env = getenv("UID_WRAPPER");
62         if (env == NULL) {
63                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
64                 return;
65         }
66
67         (void) state; /* unused */
68
69         rc = setuid(-1);
70         assert_int_equal(rc, -1);
71
72         rc = setuid(42);
73         assert_int_equal(rc, 0);
74
75         u = getuid();
76         assert_int_equal(u, 42);
77 }
78
79 static void test_uwrap_setegid(void **state)
80 {
81         int rc;
82         uid_t u;
83         char *env;
84
85         env = getenv("UID_WRAPPER");
86         if (env == NULL) {
87                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
88                 return;
89         }
90
91         (void) state; /* unused */
92
93         rc = setegid(0);
94         assert_int_equal(rc, 0);
95
96         u = getegid();
97 #ifdef SYS_getegid /* Not available on Solaris */
98         assert_int_equal(u, syscall(SYS_getegid));
99 #endif
100
101         rc = setegid(42);
102         assert_int_equal(rc, 0);
103
104         u = getegid();
105         assert_int_equal(u, 42);
106 }
107
108 static void test_uwrap_syscall(void **state)
109 {
110         long int rc;
111         char *env;
112         struct stat sb;
113
114         env = getenv("UID_WRAPPER");
115         if (env == NULL) {
116                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
117                 return;
118         }
119
120         (void) state; /* unused */
121
122         rc = access(".", R_OK);
123         assert_int_equal(rc, 0);
124
125         rc = syscall(SYS_access, ".", R_OK);
126         assert_int_equal(rc, 0);
127
128         rc = syscall(SYS_stat, ".", &sb);
129         assert_int_equal(rc, 0);
130
131         assert_true(S_ISDIR(sb.st_mode));
132 }
133
134 static void test_uwrap_syscall_setreuid(void **state)
135 {
136         long int rc;
137         uid_t u;
138         char *env;
139
140         env = getenv("UID_WRAPPER");
141         if (env == NULL) {
142                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
143                 return;
144         }
145
146         (void) state; /* unused */
147
148         rc = syscall(SYS_setreuid, -1, 0);
149         assert_int_equal(rc, 0);
150
151         u = geteuid();
152         assert_int_equal(u, syscall(SYS_geteuid));
153
154         rc = syscall(SYS_setreuid, -1, 42);
155         assert_int_equal(rc, 0);
156
157         u = geteuid();
158         assert_int_equal(u, 42);
159 }
160
161 static void test_uwrap_syscall_setregid(void **state)
162 {
163         long int rc;
164         gid_t g;
165         char *env;
166
167         env = getenv("UID_WRAPPER");
168         if (env == NULL) {
169                 printf("UID_WRAPPER env not set, uid_wrapper is disabled\n");
170                 return;
171         }
172
173         (void) state; /* unused */
174
175         rc = syscall(SYS_setregid, -1, 0);
176         assert_int_equal(rc, 0);
177
178         g = getegid();
179         assert_int_equal(g, syscall(SYS_getegid));
180
181         rc = syscall(SYS_setregid, -1, 42);
182         assert_int_equal(rc, 0);
183
184         g = getegid();
185         assert_int_equal(g, 42);
186 }
187
188 int main(void) {
189         int rc;
190
191         const UnitTest tests[] = {
192                 unit_test(test_uwrap_syscall),
193                 unit_test(test_uwrap_seteuid),
194                 unit_test(test_uwrap_setuid),
195                 unit_test(test_uwrap_setegid),
196                 unit_test(test_uwrap_syscall_setreuid),
197                 unit_test(test_uwrap_syscall_setregid),
198         };
199
200         rc = run_tests(tests);
201
202         return rc;
203 }