2 * Check decoding of setgroups/setgroups32 syscalls.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2016-2018 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
11 #ifdef __NR_setgroups32
13 # define SYSCALL_NR __NR_setgroups32
14 # define SYSCALL_NAME "setgroups32"
15 # define GID_TYPE unsigned int
22 # ifdef __NR_setgroups
24 # define SYSCALL_NR __NR_setgroups
25 # define SYSCALL_NAME "setgroups"
26 # if defined __NR_setgroups32 && __NR_setgroups != __NR_setgroups32
27 # define GID_TYPE unsigned short
29 # define GID_TYPE unsigned int
44 if (id == (GID_TYPE) -1U)
55 /* check how the first argument is decoded */
56 long rc = syscall(SYSCALL_NR, 0, 0);
57 printf("%s(0, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
59 rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK, 0);
60 printf("%s(0, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
62 rc = syscall(SYSCALL_NR, 1, 0);
63 printf("%s(1, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
65 rc = syscall(SYSCALL_NR, (long) 0xffffffff00000001ULL, 0);
66 printf("%s(1, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc));
68 rc = syscall(SYSCALL_NR, -1U, 0);
69 printf("%s(%d, NULL) = %s\n", SYSCALL_NAME, -1, sprintrc(rc));
71 rc = syscall(SYSCALL_NR, -1L, 0);
72 printf("%s(%d, NULL) = %s\n", SYSCALL_NAME, -1, sprintrc(rc));
74 /* check how the second argument is decoded */
75 TAIL_ALLOC_OBJECT_CONST_PTR(const GID_TYPE, g1);
76 GID_TYPE *const g2 = tail_alloc(sizeof(*g2) * 2);
77 GID_TYPE *const g3 = tail_alloc(sizeof(*g3) * 3);
79 rc = syscall(SYSCALL_NR, 0, g1 + 1);
80 printf("%s(0, []) = %s\n", SYSCALL_NAME, sprintrc(rc));
82 rc = syscall(SYSCALL_NR, 1, g1);
83 errstr = sprintrc(rc);
84 printf("%s(1, [", SYSCALL_NAME);
86 printf("]) = %s\n", errstr);
88 rc = syscall(SYSCALL_NR, 1, g1 + 1);
89 printf("%s(1, %p) = %s\n", SYSCALL_NAME, g1 + 1, sprintrc(rc));
91 rc = syscall(SYSCALL_NR, 1, -1L);
92 printf("%s(1, %#lx) = %s\n", SYSCALL_NAME, -1L, sprintrc(rc));
94 rc = syscall(SYSCALL_NR, 2, g1);
95 errstr = sprintrc(rc);
96 printf("%s(2, [", SYSCALL_NAME);
98 printf(", ... /* %p */]) = %s\n", g1 + 1, errstr);
102 rc = syscall(SYSCALL_NR, 2, g2);
103 errstr = sprintrc(rc);
104 printf("%s(2, [", SYSCALL_NAME);
108 printf("]) = %s\n", errstr);
110 rc = syscall(SYSCALL_NR, 3, g2);
111 errstr = sprintrc(rc);
112 printf("%s(3, [", SYSCALL_NAME);
116 printf(", ... /* %p */]) = %s\n", g2 + 2, errstr);
120 rc = syscall(SYSCALL_NR, 3, g3);
121 errstr = sprintrc(rc);
122 printf("%s(3, [", SYSCALL_NAME);
126 printf(", ...]) = %s\n", errstr);
128 rc = syscall(SYSCALL_NR, 4, g3);
129 errstr = sprintrc(rc);
130 printf("%s(4, [", SYSCALL_NAME);
134 printf(", ...]) = %s\n", errstr);
136 rc = sysconf(_SC_NGROUPS_MAX);
137 const unsigned ngroups_max = rc;
139 if ((unsigned long) rc == ngroups_max && (int) ngroups_max > 0) {
140 rc = syscall(SYSCALL_NR, ngroups_max, g3);
141 errstr = sprintrc(rc);
142 printf("%s(%d, [", SYSCALL_NAME, ngroups_max);
146 printf(", ...]) = %s\n", errstr);
148 rc = syscall(SYSCALL_NR, F8ILL_KULONG_MASK | ngroups_max, g3);
149 errstr = sprintrc(rc);
150 printf("%s(%d, [", SYSCALL_NAME, ngroups_max);
154 printf(", ...]) = %s\n", errstr);
156 rc = syscall(SYSCALL_NR, ngroups_max + 1, g3);
157 printf("%s(%d, %p) = %s\n", SYSCALL_NAME,
158 ngroups_max + 1, g3, sprintrc(rc));
161 puts("+++ exited with 0 +++");
167 SKIP_MAIN_UNDEFINED("__NR_setgroups")