10 #include <sys/types.h>
15 #ifdef HAVE_SYS_SYSCALL_H
16 #include <sys/syscall.h>
22 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
24 static void test_uwrap_syscall_setgid(void **state)
29 (void) state; /* unused */
31 rc = syscall(SYS_setgid, 1);
32 assert_int_equal(rc, 0);
35 assert_int_equal(g, 1);
37 assert_int_equal(g, syscall(SYS_getxgid));
39 assert_int_equal(g, syscall(SYS_getgid));
43 static void test_uwrap_syscall_setregid(void **state)
48 (void) state; /* unused */
50 rc = syscall(SYS_setregid, 2, 0);
51 assert_int_equal(rc, 0);
54 assert_int_equal(g, 0);
55 #ifdef SYS_getegid /* not available on Solaris */
56 assert_int_equal(g, syscall(SYS_getegid));
59 rc = syscall(SYS_setregid, -1, 42);
60 assert_int_equal(rc, 0);
63 assert_int_equal(g, 2);
65 assert_int_equal(g, 42);
68 #if defined(SYS_setresgid)
69 static void test_uwrap_syscall_setresgid(void **state)
75 (void) state; /* unused */
77 rc = syscall(SYS_setresgid, 42, 0, -1);
78 assert_int_equal(rc, 0);
81 assert_int_equal(g, 0);
83 #ifdef SYS_getresgid /* not available on Solaris */
84 rc = syscall(SYS_getresgid, &g_r, &g_e, &g_s);
85 assert_return_code(rc, errno);
87 assert_int_equal(g_r, 42);
88 assert_int_equal(g, g_e);
91 rc = syscall(SYS_setregid, -1, 42);
92 assert_return_code(rc, errno);
95 assert_int_equal(g, 42);
99 #if defined(SYS_setgroups)
100 static void test_uwrap_syscall_setgroups(void **state)
102 gid_t glist[] = { 100, 200, 300, 400, 500 };
106 (void) state; /* unused */
108 rc = syscall(SYS_setgroups, ARRAY_SIZE(glist), glist);
109 assert_int_equal(rc, 0);
111 rc = getgroups(ARRAY_SIZE(rlist), rlist);
112 assert_int_equal(rc, 5);
114 assert_memory_equal(glist, rlist, sizeof(glist));
116 /* Drop all supplementary groups. This is often done by daemons */
117 memset(rlist, 0, sizeof(rlist));
118 rc = syscall(SYS_setgroups, 0, NULL);
119 assert_int_equal(rc, 0);
121 rc = getgroups(ARRAY_SIZE(rlist), rlist);
122 assert_int_equal(rc, 0);
124 assert_int_equal(rlist[0], 0);
131 const struct CMUnitTest uwrap_tests[] = {
132 cmocka_unit_test(test_uwrap_syscall_setgid),
133 cmocka_unit_test(test_uwrap_syscall_setregid),
134 #if defined(SYS_setresgid)
135 cmocka_unit_test(test_uwrap_syscall_setresgid),
137 #if defined(SYS_setgroups)
138 cmocka_unit_test(test_uwrap_syscall_setgroups),
142 rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);