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_syscall_setreuid(void **state)
35 (void) state; /* unused */
37 #if defined(SYS_setreuid)
38 rc = syscall(SYS_setreuid, -1, 0);
39 #elif defined(SYS_setreuid32)
40 rc = syscall(SYS_setreuid32, -1, 0);
42 assert_int_equal(rc, 0);
45 #if defined(SYS_geteuid) /* not available on Solaris */
46 assert_int_equal(u, syscall(SYS_geteuid));
47 #elif defined(SYS_geteuid32)
48 assert_int_equal(u, syscall(SYS_geteuid32));
51 #if defined(SYS_setreuid)
52 rc = syscall(SYS_setreuid, -1, 42);
53 #elif defined(SYS_setreuid32)
54 rc = syscall(SYS_setreuid32, -1, 42);
56 assert_int_equal(rc, 0);
59 assert_int_equal(u, 42);
62 static void test_uwrap_syscall_setresuid(void **state)
68 (void) state; /* unused */
70 rc = syscall(SYS_setresuid, 42, 0, -1);
71 assert_int_equal(rc, 0);
74 #if defined(SYS_getresuid) /* not available on Solaris */
75 rc = syscall(SYS_getresuid, &u_r, &u_e, &u_s);
76 assert_return_code(rc, errno);
78 assert_int_equal(u_r, 42);
79 assert_int_equal(u, u_e);
80 #elif defined(SYS_getresuid32)
81 rc = syscall(SYS_getresuid32, &u_r, &u_e, &u_s);
82 assert_return_code(rc, errno);
84 assert_int_equal(u_r, 42);
85 assert_int_equal(u, u_e);
88 #if defined(SYS_setreuid)
89 rc = syscall(SYS_setreuid, -1, 42);
90 #elif defined(SYS_setreuid)
91 rc = syscall(SYS_setreuid32, -1, 42);
93 assert_return_code(rc, errno);
96 assert_int_equal(u, 42);
99 static void test_uwrap_syscall_setregid(void **state)
104 (void) state; /* unused */
106 #if defined(SYS_setregid)
107 rc = syscall(SYS_setregid, -1, 0);
108 #elif defined(SYS_setregid32)
109 rc = syscall(SYS_setregid32, -1, 0);
111 assert_int_equal(rc, 0);
114 #if defined(SYS_getegid) /* Not available on Solaris */
115 assert_int_equal(g, syscall(SYS_getegid));
116 #elif defined(SYS_getegid32)
117 assert_int_equal(g, syscall(SYS_getegid32));
120 #if defined(SYS_setregid)
121 rc = syscall(SYS_setregid, -1, 42);
122 #elif defined(SYS_setregid32)
123 rc = syscall(SYS_setregid32, -1, 42);
125 assert_int_equal(rc, 0);
128 assert_int_equal(g, 42);
131 static void test_uwrap_syscall_setresgid(void **state)
137 (void) state; /* unused */
139 rc = syscall(SYS_setresgid, 42, 0, -1);
140 assert_int_equal(rc, 0);
143 #if defined(SYS_getresgid) /* Not available on Solaris */
144 rc = syscall(SYS_getresgid, &g_r, &g_e, &g_s);
145 assert_return_code(rc, errno);
147 assert_int_equal(g_r, 42);
148 assert_int_equal(g, g_e);
149 #elif defined(SYS_getresgid32)
150 rc = syscall(SYS_getresgid32, &g_r, &g_e, &g_s);
151 assert_return_code(rc, errno);
153 assert_int_equal(g_r, 42);
154 assert_int_equal(g, g_e);
157 rc = syscall(SYS_setregid, -1, 42);
158 assert_return_code(rc, errno);
161 assert_int_equal(g, 42);
164 #if defined(SYS_setgroups) || defined(SYS_setroups32)
165 static void test_uwrap_syscall_setgroups(void **state)
167 gid_t glist[] = { 100, 200, 300, 400, 500 };
171 (void) state; /* unused */
173 #if defined(SYS_setgroups)
174 rc = syscall(SYS_setgroups, ARRAY_SIZE(glist), glist);
175 #elif defined (SYS_setgroups32)
176 rc = syscall(SYS_setgroups32, ARRAY_SIZE(glist), glist);
178 assert_int_equal(rc, 0);
180 rc = getgroups(ARRAY_SIZE(rlist), rlist);
181 assert_int_equal(rc, 5);
183 assert_memory_equal(glist, rlist, sizeof(glist));
185 /* Drop all supplementary groups. This is often done by daemons */
186 memset(rlist, 0, sizeof(rlist));
187 #if defined(SYS_setgroups)
188 rc = syscall(SYS_setgroups, 0, NULL);
189 #elif defined(SYS_setgroups32)
190 rc = syscall(SYS_setgroups32, 0, NULL);
192 assert_int_equal(rc, 0);
194 rc = getgroups(ARRAY_SIZE(rlist), rlist);
195 assert_int_equal(rc, 0);
197 assert_int_equal(rlist[0], 0);
204 const struct CMUnitTest uwrap_tests[] = {
205 cmocka_unit_test(test_uwrap_syscall_setreuid),
206 cmocka_unit_test(test_uwrap_syscall_setresuid),
207 cmocka_unit_test(test_uwrap_syscall_setregid),
208 cmocka_unit_test(test_uwrap_syscall_setresgid),
209 #if defined(SYS_setgroups) || defined(SYS_setroups32)
210 cmocka_unit_test(test_uwrap_syscall_setgroups),
214 rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);