From 3304d82108ba863d51e71af3b86c9aa0247f04f1 Mon Sep 17 00:00:00 2001 From: Eugene Syromyatnikov Date: Mon, 28 Nov 2016 02:50:03 +0300 Subject: [PATCH] uid: use printuid for printing UID/GID value * uid.c (setfsuid, get_print_uid, print_gid): Use printuid. * tests/setfsugid.c (printuid): New function. (main): Use it to print UID/GID values. * tests/setgroups.c: Likewise. * tests/setugid.c (ugid2int): Remove. (printuid): New function. (main): Use it to print UID/GID values. Co-authored-by: Elvira Khabirova --- tests/setfsugid.c | 13 ++++++++- tests/setgroups.c | 74 +++++++++++++++++++++++++++++++++++------------ tests/setugid.c | 32 +++++++++----------- uid.c | 10 ++++--- 4 files changed, 86 insertions(+), 43 deletions(-) diff --git a/tests/setfsugid.c b/tests/setfsugid.c index 5b8f4fdd..627a8dd7 100644 --- a/tests/setfsugid.c +++ b/tests/setfsugid.c @@ -30,6 +30,15 @@ #include #include +void +printuid(unsigned UGID_TYPE id) +{ + if (id == (unsigned UGID_TYPE) -1U) + printf("-1"); + else + printf("%u", id); +} + int main(void) { @@ -54,7 +63,9 @@ main(void) unsigned int rc; rc = syscall(SYSCALL_NR, tests[i]); - printf("%s(%u) = %u\n", SYSCALL_NAME, num, rc); + printf("%s(", SYSCALL_NAME); + printuid(num); + printf(") = %u\n", rc); rc = syscall(SYSCALL_NR, ugid); printf("%s(%u) = %u\n", SYSCALL_NAME, ugid, rc); diff --git a/tests/setgroups.c b/tests/setgroups.c index 5068ff47..18295c6b 100644 --- a/tests/setgroups.c +++ b/tests/setgroups.c @@ -57,9 +57,20 @@ # include # include +void +printuid(GID_TYPE id) +{ + if (id == (GID_TYPE) -1U) + printf("-1"); + else + printf("%u", id); +} + int main(void) { + const char *errstr; + /* check how the first argument is decoded */ long rc = syscall(SYSCALL_NR, 0, 0); printf("%s(0, NULL) = %s\n", SYSCALL_NAME, sprintrc(rc)); @@ -88,8 +99,10 @@ main(void) printf("%s(0, []) = %s\n", SYSCALL_NAME, sprintrc(rc)); rc = syscall(SYSCALL_NR, 1, g1); - printf("%s(1, [%u]) = %s\n", - SYSCALL_NAME, (unsigned) *g1, sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(1, [", SYSCALL_NAME); + printuid(*g1); + printf("]) = %s\n", errstr); rc = syscall(SYSCALL_NR, 1, g1 + 1); printf("%s(1, %p) = %s\n", SYSCALL_NAME, g1 + 1, sprintrc(rc)); @@ -98,45 +111,68 @@ main(void) printf("%s(1, %#lx) = %s\n", SYSCALL_NAME, -1L, sprintrc(rc)); rc = syscall(SYSCALL_NR, 2, g1); - printf("%s(2, [%u, %p]) = %s\n", - SYSCALL_NAME, (unsigned) *g1, g1 + 1, sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(2, [", SYSCALL_NAME); + printuid(*g1); + printf(", %p]) = %s\n", g1 + 1, errstr); g2[0] = -2; g2[1] = -3; rc = syscall(SYSCALL_NR, 2, g2); - printf("%s(2, [%u, %u]) = %s\n", SYSCALL_NAME, - (unsigned) g2[0], (unsigned) g2[1], sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(2, [", SYSCALL_NAME); + printuid(g2[0]); + printf(", "); + printuid(g2[1]); + printf("]) = %s\n", errstr); rc = syscall(SYSCALL_NR, 3, g2); - printf("%s(3, [%u, %u, %p]) = %s\n", SYSCALL_NAME, - (unsigned) g2[0], (unsigned) g2[1], g2 + 2, sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(3, [", SYSCALL_NAME); + printuid(g2[0]); + printf(", "); + printuid(g2[1]); + printf(", %p]) = %s\n", g2 + 2, errstr); g3[0] = 0; g3[1] = 1; rc = syscall(SYSCALL_NR, 3, g3); - printf("%s(3, [%u, %u%s]) = %s\n", SYSCALL_NAME, - (unsigned) g3[0], (unsigned) g3[1], rc ? ", ..." : "", - sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(3, [", SYSCALL_NAME); + printuid(g3[0]); + printf(", "); + printuid(g3[1]); + printf(", ...]) = %s\n", errstr); rc = syscall(SYSCALL_NR, 4, g3); - printf("%s(4, [%u, %u, ...]) = %s\n", SYSCALL_NAME, - (unsigned) g3[0], (unsigned) g3[1], sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(4, [", SYSCALL_NAME); + printuid(g3[0]); + printf(", "); + printuid(g3[1]); + printf(", ...]) = %s\n", errstr); rc = sysconf(_SC_NGROUPS_MAX); const unsigned ngroups_max = rc; if ((unsigned long) rc == ngroups_max && (int) ngroups_max > 0) { rc = syscall(SYSCALL_NR, ngroups_max, g3); - printf("%s(%u, [%u, %u, ...]) = %s\n", SYSCALL_NAME, - ngroups_max, (unsigned) g3[0], (unsigned) g3[1], - sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(%u, [", SYSCALL_NAME, ngroups_max); + printuid(g3[0]); + printf(", "); + printuid(g3[1]); + printf(", ...]) = %s\n", errstr); const unsigned long size = (unsigned long) 0xffffffff00000000ULL | ngroups_max; rc = syscall(SYSCALL_NR, size, g3); - printf("%s(%u, [%u, %u, ...]) = %s\n", SYSCALL_NAME, - ngroups_max, (unsigned) g3[0], (unsigned) g3[1], - sprintrc(rc)); + errstr = sprintrc(rc); + printf("%s(%u, [", SYSCALL_NAME, ngroups_max); + printuid(g3[0]); + printf(", "); + printuid(g3[1]); + printf(", ...]) = %s\n", errstr); rc = syscall(SYSCALL_NR, ngroups_max + 1, g3); printf("%s(%u, %p) = %s\n", SYSCALL_NAME, diff --git a/tests/setugid.c b/tests/setugid.c index dd6b921a..aba277c5 100644 --- a/tests/setugid.c +++ b/tests/setugid.c @@ -31,13 +31,13 @@ #include #include -static int -ugid2int(const unsigned UGID_TYPE ugid) +void +printuid(unsigned UGID_TYPE id) { - if ((unsigned UGID_TYPE) -1U == ugid) - return -1; + if (id == (unsigned UGID_TYPE) -1U) + printf("-1"); else - return ugid; + printf("%u", id); } int @@ -58,22 +58,23 @@ main(void) unsigned int i; for (i = 0; i < ARRAY_SIZE(tests); ++i) { - const unsigned int num = ugid2int(tests[i]); + const unsigned int num = (unsigned UGID_TYPE) tests[i]; long expected; if (num == ugid) expected = 0; - else if (num == -1U) + else if ((UGID_TYPE) num == (UGID_TYPE) -1U) expected = -1; else continue; const long rc = syscall(SYSCALL_NR, tests[i]); - int saved_errno = errno; + const char *errstr = sprintrc(rc); + if (rc != expected) { if (!i && ENOSYS == errno) { - printf("%s(%u) = -1 ENOSYS (%m)\n", - SYSCALL_NAME, ugid); + printf("%s(%u) = %s\n", + SYSCALL_NAME, ugid, errstr); break; } perror_msg_and_fail("%s(%#lx) != %ld", @@ -81,15 +82,8 @@ main(void) } printf("%s(", SYSCALL_NAME); - if (num == -1U) - printf("-1"); - else - printf("%u", num); - errno = saved_errno; - if (expected) - printf(") = -1 %s (%m)\n", errno2name()); - else - printf(") = 0\n"); + printuid(num); + printf(") = %s\n", errstr); } puts("+++ exited with 0 +++"); diff --git a/uid.c b/uid.c index 67e8e58a..a9657169 100644 --- a/uid.c +++ b/uid.c @@ -75,7 +75,7 @@ SYS_FUNC(getuid) SYS_FUNC(setfsuid) { - tprintf("%u", (uid_t) tcp->u_arg[0]); + printuid("", tcp->u_arg[0]); return RVAL_UDECIMAL | RVAL_DECODED; } @@ -93,8 +93,10 @@ get_print_uid(struct tcb *tcp, const char *prefix, const long addr) uid_t uid; tprints(prefix); - if (!umove_or_printaddr(tcp, addr, &uid)) - tprintf("[%u]", uid); + if (!umove_or_printaddr(tcp, addr, &uid)) { + printuid("[", uid); + tprints("]"); + } } SYS_FUNC(getresuid) @@ -156,7 +158,7 @@ printuid(const char *text, const unsigned int uid) static bool print_gid(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) { - tprintf("%u", (unsigned int) (* (uid_t *) elem_buf)); + printuid("", (* (uid_t *) elem_buf)); return true; } -- 2.40.0