ctest: Move to new dashboard
[uid_wrapper.git] / tests / test_syscall_gid.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 <sys/types.h>
11 #include <unistd.h>
12
13 #include <grp.h>
14
15 #ifdef HAVE_SYS_SYSCALL_H
16 #include <sys/syscall.h>
17 #endif
18 #ifdef HAVE_SYSCALL_H
19 #include <syscall.h>
20 #endif
21
22 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
23
24 static void test_uwrap_syscall_setgid(void **state)
25 {
26         long int rc;
27         gid_t g;
28
29         (void) state; /* unused */
30
31         rc = syscall(SYS_setgid, 1);
32         assert_int_equal(rc, 0);
33
34         g = getgid();
35         assert_int_equal(g, 1);
36 #ifdef __alpha__
37         assert_int_equal(g, syscall(SYS_getxgid));
38 #else
39         assert_int_equal(g, syscall(SYS_getgid));
40 #endif
41 }
42
43 static void test_uwrap_syscall_setregid(void **state)
44 {
45         long int rc;
46         gid_t g;
47
48         (void) state; /* unused */
49
50         rc = syscall(SYS_setregid, 2, 0);
51         assert_int_equal(rc, 0);
52
53         g = getegid();
54         assert_int_equal(g, 0);
55 #ifdef SYS_getegid /* not available on Solaris */
56         assert_int_equal(g, syscall(SYS_getegid));
57 #endif
58
59         rc = syscall(SYS_setregid, -1, 42);
60         assert_int_equal(rc, 0);
61
62         g = getgid();
63         assert_int_equal(g, 2);
64         g = getegid();
65         assert_int_equal(g, 42);
66 }
67
68 #if defined(SYS_setresgid)
69 static void test_uwrap_syscall_setresgid(void **state)
70 {
71         long int rc;
72         gid_t g;
73         gid_t g_r, g_e, g_s;
74
75         (void) state; /* unused */
76
77         rc = syscall(SYS_setresgid, 42, 0, -1);
78         assert_int_equal(rc, 0);
79
80         g = getegid();
81         assert_int_equal(g, 0);
82
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);
86
87         assert_int_equal(g_r, 42);
88         assert_int_equal(g, g_e);
89 #endif
90
91         rc = syscall(SYS_setregid, -1, 42);
92         assert_return_code(rc, errno);
93
94         g = getegid();
95         assert_int_equal(g, 42);
96 }
97 #endif
98
99 #if defined(SYS_setgroups)
100 static void test_uwrap_syscall_setgroups(void **state)
101 {
102         gid_t glist[] = { 100, 200, 300, 400, 500 };
103         gid_t rlist[16];
104         int rc = -1;
105
106         (void) state; /* unused */
107
108         rc = syscall(SYS_setgroups, ARRAY_SIZE(glist), glist);
109         assert_int_equal(rc, 0);
110
111         rc = getgroups(ARRAY_SIZE(rlist), rlist);
112         assert_int_equal(rc, 5);
113
114         assert_memory_equal(glist, rlist, sizeof(glist));
115
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);
120
121         rc = getgroups(ARRAY_SIZE(rlist), rlist);
122         assert_int_equal(rc, 0);
123
124         assert_int_equal(rlist[0], 0);
125 }
126 #endif
127
128 int main(void) {
129         int rc;
130
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),
136 #endif
137 #if defined(SYS_setgroups)
138                 cmocka_unit_test(test_uwrap_syscall_setgroups),
139 #endif
140         };
141
142         rc = cmocka_run_group_tests(uwrap_tests, NULL, NULL);
143
144         return rc;
145 }