10 #include <sys/types.h>
16 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
18 #define TEST_MOCK_EXECUTABLE "mock_exec_uid"
20 static void test_uwrap_fork_exec(void **state)
24 uid_t cp_ruid, cp_euid, cp_suid;
25 gid_t glist[] = {0, 10000, 20000, 40000, 100000};
27 (void)state; /* unused */
29 rc = getresuid(&cp_ruid, &cp_euid, &cp_suid);
30 assert_return_code(rc, errno);
31 assert_int_equal(cp_ruid, 0);
32 assert_int_equal(cp_euid, 0);
33 assert_int_equal(cp_suid, 0);
35 rc = setresuid(2000, -1, 4000);
36 assert_return_code(rc, errno);
39 assert_return_code(rc, errno);
41 rc = setgroups(ARRAY_SIZE(glist), glist);
42 assert_return_code(rc, errno);
45 assert_return_code(pid, errno);
49 char const *argv[] = {
59 snprintf(cmd, sizeof(cmd),
62 TEST_MOCK_EXECUTABLE);
64 rc = execvp(cmd, (char *const *)argv);
73 rc = setresuid(cp_ruid, cp_euid, cp_suid);
74 assert_return_code(rc, errno);
76 child_pid = waitpid(-1, &wstatus, 0);
77 assert_return_code(child_pid, errno);
79 assert_true(WIFEXITED(wstatus));
81 assert_int_equal(WEXITSTATUS(wstatus), 0);
88 const struct CMUnitTest uwrap_tests[] = {
89 cmocka_unit_test(test_uwrap_fork_exec),
92 rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);