2 * Check decoding of setreuid/setregid/setreuid32/setregid32 syscalls.
4 * Copyright (c) 2016-2018 Dmitry V. Levin <ldv@altlinux.org>
7 * SPDX-License-Identifier: GPL-2.0-or-later
15 ugid2int(const unsigned UGID_TYPE ugid)
17 if ((unsigned UGID_TYPE) -1U == ugid)
24 print_int(const unsigned int num)
33 num_matches_id(const unsigned int num, const unsigned int ugid)
35 return num == ugid || num == -1U;
38 #define PAIR(val) { val, ugid }, { ugid, val }
43 unsigned int ugid = GETUGID;
44 CHECK_OVERFLOWUGID(ugid);
50 PAIR((unsigned long) 0xffffffff00000000ULL | ugid),
53 PAIR(0xffff0000U | ugid),
60 for (i = 0; i < ARRAY_SIZE(tests); ++i) {
61 const unsigned int rn = ugid2int(tests[i].r);
62 const unsigned int en = ugid2int(tests[i].e);
64 if (!num_matches_id(rn, ugid) || !num_matches_id(en, ugid))
67 if (syscall(SYSCALL_NR, tests[i].r, tests[i].e)) {
68 if (!i && ENOSYS == errno) {
69 printf("%s(%u, %u) = -1 ENOSYS (%m)\n",
70 SYSCALL_NAME, ugid, ugid);
73 perror_msg_and_fail("%s(%#lx, %#lx)", SYSCALL_NAME,
74 tests[i].r, tests[i].e);
77 printf("%s(", SYSCALL_NAME);
84 puts("+++ exited with 0 +++");