]> granicus.if.org Git - strace/commitdiff
uid: use printuid for printing UID/GID value
authorEugene Syromyatnikov <evgsyr@gmail.com>
Sun, 27 Nov 2016 23:50:03 +0000 (02:50 +0300)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 4 Dec 2016 17:42:38 +0000 (17:42 +0000)
* 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 <lineprinter0@gmail.com>
tests/setfsugid.c
tests/setgroups.c
tests/setugid.c
uid.c

index 5b8f4fdd81a15840b5daf36abd4611a3fe8c43fd..627a8dd7a05c2b1f260d0fdcb9c63697d07ca0b2 100644 (file)
 #include <stdio.h>
 #include <unistd.h>
 
+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);
index 5068ff47a7e612a482e2e3f4ee471e82f0657fda..18295c6b4256ac9dc0da46cf2ee1d43fc3d370be 100644 (file)
 # include <stdio.h>
 # include <unistd.h>
 
+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,
index dd6b921a5c2b99d3fa22548fbd40e366168aa608..aba277c5904c72aa1a5f16394ef70105e354f7a9 100644 (file)
 #include <stdio.h>
 #include <unistd.h>
 
-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 67e8e58a0935d1db95a5d72b0f92215570929597..a96571697dba4b996761c6d9fafd092e143891a0 100644 (file)
--- 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;
 }