12 #include <sys/types.h>
20 #ifdef HAVE_SYS_SYSCALL_H
21 #include <sys/syscall.h>
27 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
28 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
30 static void test_uwrap_seteuid(void **state)
35 (void) state; /* unused */
38 assert_int_equal(rc, -1);
41 assert_int_equal(rc, 0);
44 #ifdef SYS_geteuid /* not available on Solaris */
45 assert_int_equal(u, syscall(SYS_geteuid));
49 assert_int_equal(rc, 0);
52 assert_int_equal(u, 42);
56 static void test_uwrap_setreuid(void **state)
61 (void) state; /* unused */
64 assert_int_equal(rc, 0);
67 assert_int_equal(u, 1);
70 assert_int_equal(u, 2);
75 static void test_uwrap_setresuid(void **state)
80 (void) state; /* unused */
82 rc = setresuid(1, 2, -1);
83 assert_int_equal(rc, 0);
86 assert_int_equal(u, 1);
89 assert_int_equal(u, 2);
94 static void test_uwrap_getresuid(void **state)
99 (void) state; /* unused */
101 rc = setresuid(1, 2, -1);
102 assert_int_equal(rc, 0);
105 assert_int_equal(ru, 1);
108 assert_int_equal(eu, 2);
110 rc = getresuid(&ru, &eu, &su);
111 assert_int_equal(ru, 1);
112 assert_int_equal(eu, 2);
116 static void test_uwrap_setuid(void **state)
121 (void) state; /* unused */
124 assert_int_equal(rc, -1);
127 assert_int_equal(rc, 0);
130 assert_int_equal(u, 42);
133 static void test_uwrap_setegid(void **state)
138 (void) state; /* unused */
141 assert_int_equal(rc, 0);
144 #ifdef SYS_getegid /* Not available on Solaris */
145 assert_int_equal(u, syscall(SYS_getegid));
149 assert_int_equal(rc, 0);
152 assert_int_equal(u, 42);
156 static void test_uwrap_setregid(void **state)
161 (void) state; /* unused */
164 assert_int_equal(rc, 0);
167 assert_int_equal(u, 1);
170 assert_int_equal(u, 2);
174 #ifdef HAVE_SETRESGID
175 static void test_uwrap_setresgid(void **state)
180 (void) state; /* unused */
182 rc = setresgid(1, 2, -1);
183 assert_int_equal(rc, 0);
186 assert_int_equal(u, 1);
189 assert_int_equal(u, 2);
193 static void test_uwrap_setgid(void **state)
198 (void) state; /* unused */
201 assert_int_equal(rc, -1);
204 assert_int_equal(rc, 0);
207 assert_int_equal(u, 42);
210 static void test_uwrap_syscall(void **state)
213 struct timeval tv1, tv2;
214 struct timezone tz1, tz2;
216 (void) state; /* unused */
218 rc = syscall(SYS_getpid);
219 assert_int_equal(rc, getpid());
226 rc = gettimeofday(&tv1, &tz1);
227 assert_int_equal(rc, 0);
230 tv2.tv_sec = syscall(SYS_gettimeofday, &tv2, NULL);
232 rc = syscall(SYS_gettimeofday, &tv2, &tz2);
233 assert_int_equal(rc, 0);
234 assert_int_equal(tz1.tz_dsttime, tz2.tz_dsttime);
235 assert_int_equal(tz1.tz_minuteswest, tz2.tz_minuteswest);
238 assert_int_equal(tv1.tv_sec, tv2.tv_sec);
241 static void test_uwrap_syscall_setreuid(void **state)
246 (void) state; /* unused */
248 #if defined(SYS_setreuid)
249 rc = syscall(SYS_setreuid, -1, 0);
250 #elif defined(SYS_setreuid32)
251 rc = syscall(SYS_setreuid32, -1, 0);
253 assert_int_equal(rc, 0);
256 #if defined(SYS_geteuid) /* not available on Solaris */
257 assert_int_equal(u, syscall(SYS_geteuid));
258 #elif defined(SYS_geteuid32)
259 assert_int_equal(u, syscall(SYS_geteuid32));
262 #if defined(SYS_setreuid)
263 rc = syscall(SYS_setreuid, -1, 42);
264 #elif defined(SYS_setreuid32)
265 rc = syscall(SYS_setreuid32, -1, 42);
267 assert_int_equal(rc, 0);
270 assert_int_equal(u, 42);
273 static void test_uwrap_syscall_setresuid(void **state)
279 (void) state; /* unused */
281 rc = syscall(SYS_setresuid, -1, 0, -1);
282 assert_int_equal(rc, 0);
285 #if defined(SYS_getresuid) /* not available on Solaris */
286 rc = syscall(SYS_getresuid, &u_r, &u_e, &u_s);
287 assert_return_code(rc, errno);
289 assert_int_equal(u_r, 42);
290 assert_int_equal(u, u_e);
291 #elif defined(SYS_getresuid32)
292 rc = syscall(SYS_getresuid32, &u_r, &u_e, &u_s);
293 assert_return_code(rc, errno);
295 assert_int_equal(u_r, 42);
296 assert_int_equal(u, u_e);
299 #if defined(SYS_setreuid)
300 rc = syscall(SYS_setreuid, -1, 42);
301 #elif defined(SYS_setreuid)
302 rc = syscall(SYS_setreuid32, -1, 42);
304 assert_return_code(rc, errno);
307 assert_int_equal(u, 42);
310 static void test_uwrap_syscall_setregid(void **state)
315 (void) state; /* unused */
317 #if defined(SYS_setregid)
318 rc = syscall(SYS_setregid, -1, 0);
319 #elif defined(SYS_setregid32)
320 rc = syscall(SYS_setregid32, -1, 0);
322 assert_int_equal(rc, 0);
325 #if defined(SYS_getegid) /* Not available on Solaris */
326 assert_int_equal(g, syscall(SYS_getegid));
327 #elif defined(SYS_getegid32)
328 assert_int_equal(g, syscall(SYS_getegid32));
331 #if defined(SYS_setregid)
332 rc = syscall(SYS_setregid, -1, 42);
333 #elif defined(SYS_setregid32)
334 rc = syscall(SYS_setregid32, -1, 42);
336 assert_int_equal(rc, 0);
339 assert_int_equal(g, 42);
342 static void test_uwrap_syscall_setresgid(void **state)
348 (void) state; /* unused */
350 rc = syscall(SYS_setresgid, -1, 0, -1);
351 assert_int_equal(rc, 0);
354 #if defined(SYS_getresgid) /* Not available on Solaris */
355 rc = syscall(SYS_getresgid, &g_r, &g_e, &g_s);
356 assert_return_code(rc, errno);
358 assert_int_equal(g_r, 42);
359 assert_int_equal(g, g_e);
360 #elif defined(SYS_getresgid32)
361 rc = syscall(SYS_getresgid32, &g_r, &g_e, &g_s);
362 assert_return_code(rc, errno);
364 assert_int_equal(g_r, 42);
365 assert_int_equal(g, g_e);
368 rc = syscall(SYS_setregid, -1, 42);
369 assert_return_code(rc, errno);
372 assert_int_equal(g, 42);
375 static void test_uwrap_getgroups(void **state)
377 gid_t rlist[20] = {0};
381 (void) state; /* unused */
382 num_groups = getgroups(0, NULL);
383 assert_int_not_equal(num_groups, -1);
385 rc = getgroups(ARRAY_SIZE(rlist), rlist);
386 assert_int_equal(rc, num_groups);
387 assert_int_equal(rlist[0], getegid());
390 static void test_uwrap_setgroups(void **state)
392 gid_t glist[] = { 100, 200, 300, 400, 500 };
396 (void) state; /* unused */
398 rc = setgroups(ARRAY_SIZE(glist), glist);
399 assert_int_equal(rc, 0);
401 rc = getgroups(ARRAY_SIZE(rlist), rlist);
402 assert_int_equal(rc, 5);
404 assert_memory_equal(glist, rlist, sizeof(glist));
406 /* Drop all supplementary groups. This is often done by daemons */
407 memset(rlist, 0, sizeof(rlist));
409 rc = setgroups(0, NULL);
410 assert_int_equal(rc, 0);
412 rc = getgroups(ARRAY_SIZE(rlist), rlist);
413 assert_int_equal(rc, 0);
415 assert_int_equal(rlist[0], 0);
418 #if defined(SYS_setgroups) || defined(SYS_setroups32)
419 static void test_uwrap_syscall_setgroups(void **state)
421 gid_t glist[] = { 100, 200, 300, 400, 500 };
425 (void) state; /* unused */
427 #if defined(SYS_setgroups)
428 rc = syscall(SYS_setgroups, ARRAY_SIZE(glist), glist);
429 #elif defined (SYS_setgroups32)
430 rc = syscall(SYS_setgroups32, ARRAY_SIZE(glist), glist);
432 assert_int_equal(rc, 0);
434 rc = getgroups(ARRAY_SIZE(rlist), rlist);
435 assert_int_equal(rc, 5);
437 assert_memory_equal(glist, rlist, sizeof(glist));
439 /* Drop all supplementary groups. This is often done by daemons */
440 memset(rlist, 0, sizeof(rlist));
441 #if defined(SYS_setgroups)
442 rc = syscall(SYS_setgroups, 0, NULL);
443 #elif defined(SYS_setgroups32)
444 rc = syscall(SYS_setgroups32, 0, NULL);
446 assert_int_equal(rc, 0);
448 rc = getgroups(ARRAY_SIZE(rlist), rlist);
449 assert_int_equal(rc, 0);
451 assert_int_equal(rlist[0], 0);
458 const struct CMUnitTest uwrap_tests[] = {
459 cmocka_unit_test(test_uwrap_syscall),
460 cmocka_unit_test(test_uwrap_getgroups),
462 cmocka_unit_test(test_uwrap_seteuid),
464 cmocka_unit_test(test_uwrap_setreuid),
466 #ifdef HAVE_SETRESUID
467 cmocka_unit_test(test_uwrap_setresuid),
469 #ifdef HAVE_GETRESUID
470 cmocka_unit_test(test_uwrap_getresuid),
472 cmocka_unit_test(test_uwrap_setuid),
473 cmocka_unit_test(test_uwrap_setegid),
475 cmocka_unit_test(test_uwrap_setregid),
477 #ifdef HAVE_SETRESGID
478 cmocka_unit_test(test_uwrap_setresgid),
480 cmocka_unit_test(test_uwrap_setgid),
481 cmocka_unit_test(test_uwrap_syscall_setreuid),
482 cmocka_unit_test(test_uwrap_syscall_setresuid),
483 cmocka_unit_test(test_uwrap_syscall_setregid),
484 cmocka_unit_test(test_uwrap_syscall_setresgid),
485 cmocka_unit_test(test_uwrap_setgroups),
486 #if defined(SYS_setgroups) || defined(SYS_setroups32)
487 cmocka_unit_test(test_uwrap_syscall_setgroups),
491 rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);