2 * Check decoding of setresuid/setresgid/setresuid32/setresgid32 syscalls.
4 * Copyright (c) 2016 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;
39 { val, ugid, ugid }, { ugid, val, ugid }, { ugid, ugid, val }
44 unsigned int ugid = GETUGID;
45 CHECK_OVERFLOWUGID(ugid);
51 TRIPLE((unsigned long) 0xffffffff00000000ULL | ugid),
54 TRIPLE(0xffff0000U | ugid),
61 for (i = 0; i < ARRAY_SIZE(tests); ++i) {
62 const unsigned int rn = ugid2int(tests[i].r);
63 const unsigned int en = ugid2int(tests[i].e);
64 const unsigned int sn = ugid2int(tests[i].s);
66 if (!num_matches_id(rn, ugid) ||
67 !num_matches_id(en, ugid) ||
68 !num_matches_id(sn, ugid))
71 if (syscall(SYSCALL_NR, tests[i].r, tests[i].e, tests[i].s)) {
72 if (!i && ENOSYS == errno) {
73 printf("%s(%u, %u, %u) = -1 ENOSYS (%m)\n",
74 SYSCALL_NAME, ugid, ugid, ugid);
77 perror_msg_and_fail("%s(%#lx, %#lx, %#lx)",
79 tests[i].r, tests[i].e, tests[i].s);
82 printf("%s(", SYSCALL_NAME);
91 puts("+++ exited with 0 +++");