1 /*
2 * Check decoding of setfsuid/setfsgid/setfsuid32/setfsgid32 syscalls.
3 *
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2016-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include <stdio.h>
12 #include <unistd.h>
13
14 static void
15 printuid(unsigned UGID_TYPE id)
16 {
17 if (id == (unsigned UGID_TYPE) -1U)
18 printf("-1");
19 else
20 printf("%u", id);
21 }
22
23 int
24 main(void)
25 {
26 unsigned int ugid = GETUGID;
27
28 const kernel_ulong_t tests[] = {
29 ugid,
30 0xffff0000U | ugid,
31 F8ILL_KULONG_MASK | ugid,
32 0xffffU,
33 -1U,
34 -1L,
35 0xc0deffffU,
36 0xfacefeedU,
37 (long) 0xfacefeeddeadbeefULL
38 };
39
40 for (unsigned int i = 0; i < ARRAY_SIZE(tests); ++i) {
41 const unsigned int num = (unsigned UGID_TYPE) tests[i];
42 unsigned int rc;
43
44 rc = syscall(SYSCALL_NR, tests[i]);
45 printf("%s(", SYSCALL_NAME);
46 printuid(num);
47 printf(") = %u\n", rc);
48
49 rc = syscall(SYSCALL_NR, ugid);
50 printf("%s(%u) = %u\n", SYSCALL_NAME, ugid, rc);
51 }
52
53 puts("+++ exited with 0 +++");
54 return 0;
55 }