]> granicus.if.org Git - strace/commitdiff
Fix printing tracee's long integers
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 18 Aug 2015 14:58:27 +0000 (14:58 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 18 Aug 2015 16:15:33 +0000 (16:15 +0000)
Replace ambiguous printnum_long that used to fetch native long integers
from tracee's memory with printnum_ptr, printnum_slong, and printnum_ulong
that fetch tracee's pointer, signed long, and unsigned long integers.

* defs.h (printnum_long, printpair_long): Remove prototypes.
(printnum_int64, printpair_int64): Remove macros, declare functions
unconditionally.
[SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4] (printnum_long_int):
New prototype.
(printnum_ptr, printnum_slong, printnum_ulong): New macros.
* aio.c (sys_io_setup): Use printnum_ulong.
* block.c (block_ioctl): Use printnum_slong and printnum_ulong.
* get_robust_list.c (sys_get_robust_list): Use printnum_ptr
and printnum_ulong.
* io.c (print_off_t): Remove.
(sys_sendfile): Use printnum_ulong.
* ipc.c (sys_semctl): Use printnum_ptr.
* prctl.c (sys_prctl): Likewise.
* process.c (sys_ptrace): Likewise.
* rtc.c (rtc_ioctl): Use printnum_ulong.
* util.c (printnum_long, printpair_long): Remove.
(printnum_int64, printpair_int64): Define unconditionally.
[SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4] (printnum_long_int):
New function.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Elvira Khabirova <lineprinter0@gmail.com>
aio.c
block.c
defs.h
get_robust_list.c
io.c
ipc.c
prctl.c
process.c
rtc.c
util.c

diff --git a/aio.c b/aio.c
index fd10553f77916e9c9ce86048c7299e7929c9fa31..3b6cf50385179c24df93ce773bf10f46836139aa 100644 (file)
--- a/aio.c
+++ b/aio.c
@@ -43,11 +43,7 @@ SYS_FUNC(io_setup)
        if (entering(tcp))
                tprintf("%ld, ", tcp->u_arg[0]);
        else
-#ifdef X32
-               printnum_int64(tcp, tcp->u_arg[1], "%" PRIu64);
-#else
-               printnum_long(tcp, tcp->u_arg[1], "%lu");
-#endif
+               printnum_ulong(tcp, tcp->u_arg[1]);
        return 0;
 }
 
diff --git a/block.c b/block.c
index 3b1de513876a2eb700ef4a23581fc273b1140654..1e02fa71bf30f51254710a6c6cac8fc42357365f 100644 (file)
--- a/block.c
+++ b/block.c
@@ -165,7 +165,7 @@ block_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                if (entering(tcp))
                        return 0;
                tprints(", ");
-               printnum_long(tcp, arg, "%ld");
+               printnum_slong(tcp, arg);
                break;
 
        /* returns an unsigned long */
@@ -173,7 +173,7 @@ block_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                if (entering(tcp))
                        return 0;
                tprints(", ");
-               printnum_long(tcp, arg, "%lu");
+               printnum_ulong(tcp, arg);
                break;
 
 #ifdef HAVE_BLKGETSIZE64
diff --git a/defs.h b/defs.h
index 29c2131e21606c978046d9cab162c8fe644c797f..857175def38c4ef7193fd029ad5667903f5d7d93 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -534,24 +534,39 @@ extern void printnum_short(struct tcb *, long, const char *)
        ATTRIBUTE_FORMAT((printf, 3, 0));
 extern void printnum_int(struct tcb *, long, const char *)
        ATTRIBUTE_FORMAT((printf, 3, 0));
-extern void printnum_long(struct tcb *, long, const char *)
-       ATTRIBUTE_FORMAT((printf, 3, 0));
-#if SIZEOF_LONG == 8
-# define printnum_int64 printnum_long
-#else
 extern void printnum_int64(struct tcb *, long, const char *)
        ATTRIBUTE_FORMAT((printf, 3, 0));
+
+#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+extern void printnum_long_int(struct tcb *, long, const char *, const char *)
+       ATTRIBUTE_FORMAT((printf, 3, 0))
+       ATTRIBUTE_FORMAT((printf, 4, 0));
+# define printnum_slong(tcp, addr) \
+       printnum_long_int((tcp), (addr), "%" PRId64, "%d")
+# define printnum_ulong(tcp, addr) \
+       printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
+# define printnum_ptr(tcp, addr) \
+       printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
+#elif SIZEOF_LONG > 4
+# define printnum_slong(tcp, addr) \
+       printnum_int64((tcp), (addr), "%" PRId64)
+# define printnum_ulong(tcp, addr) \
+       printnum_int64((tcp), (addr), "%" PRIu64)
+# define printnum_ptr(tcp, addr) \
+       printnum_int64((tcp), (addr), "%#" PRIx64)
+#else
+# define printnum_slong(tcp, addr) \
+       printnum_int((tcp), (addr), "%d")
+# define printnum_ulong(tcp, addr) \
+       printnum_int((tcp), (addr), "%u")
+# define printnum_ptr(tcp, addr) \
+       printnum_int((tcp), (addr), "%#x")
 #endif
+
 extern void printpair_int(struct tcb *, long, const char *)
        ATTRIBUTE_FORMAT((printf, 3, 0));
-extern void printpair_long(struct tcb *, long, const char *)
-       ATTRIBUTE_FORMAT((printf, 3, 0));
-#if SIZEOF_LONG == 8
-# define printpair_int64 printpair_long
-#else
 extern void printpair_int64(struct tcb *, long, const char *)
        ATTRIBUTE_FORMAT((printf, 3, 0));
-#endif
 extern void printpath(struct tcb *, long);
 extern void printpathn(struct tcb *, long, unsigned int);
 #define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
index 02f814827b5136daeec6c6492eee43390f540d17..beec52b380f78c40a65b032146ed901b7ef1d37b 100644 (file)
@@ -5,9 +5,9 @@ SYS_FUNC(get_robust_list)
        if (entering(tcp)) {
                tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]);
        } else {
-               printnum_long(tcp, tcp->u_arg[1], "%#lx");
+               printnum_ptr(tcp, tcp->u_arg[1]);
                tprints(", ");
-               printnum_long(tcp, tcp->u_arg[2], "%lu");
+               printnum_ulong(tcp, tcp->u_arg[2]);
        }
        return 0;
 }
diff --git a/io.c b/io.c
index b701f81b7eb796ea9419aa551d4f6db04520a5e5..69198ad7fab47f17f01acc53423ba760f5c0a216 100644 (file)
--- a/io.c
+++ b/io.c
@@ -244,22 +244,13 @@ SYS_FUNC(pwritev)
        return RVAL_DECODED;
 }
 
-static void
-print_off_t(struct tcb *tcp, long addr)
-{
-       if (current_wordsize == sizeof(int))
-               printnum_int(tcp, addr, "%u");
-       else
-               printnum_long(tcp, addr, "%lu");
-}
-
 SYS_FUNC(sendfile)
 {
        printfd(tcp, tcp->u_arg[0]);
        tprints(", ");
        printfd(tcp, tcp->u_arg[1]);
        tprints(", ");
-       print_off_t(tcp, tcp->u_arg[2]);
+       printnum_ulong(tcp, tcp->u_arg[2]);
        tprintf(", %lu", tcp->u_arg[3]);
 
        return RVAL_DECODED;
diff --git a/ipc.c b/ipc.c
index c868e607c9781855fe5750d7ebaa4a8618ac8a2c..ec491eb4473054f1c021744a2e823cf4a4a738ec 100644 (file)
--- a/ipc.c
+++ b/ipc.c
@@ -244,10 +244,7 @@ SYS_FUNC(semctl)
        PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
        tprints(", ");
        if (indirect_ipccall(tcp)) {
-               if (current_wordsize == sizeof(int))
-                       printnum_int(tcp, tcp->u_arg[3], "%#x");
-               else
-                       printnum_long(tcp, tcp->u_arg[3], "%#lx");
+               printnum_ptr(tcp, tcp->u_arg[3]);
        } else {
                tprintf("%#lx", tcp->u_arg[3]);
        }
diff --git a/prctl.c b/prctl.c
index 90efe16ec0be8f72e9fdbf11977b9370519471c6..cfd117f1de0cf815d8476ddfdfbc03cdbeb36334 100644 (file)
--- a/prctl.c
+++ b/prctl.c
@@ -100,7 +100,7 @@ SYS_FUNC(prctl)
                if (entering(tcp))
                        tprints(", ");
                else
-                       printnum_long(tcp, tcp->u_arg[1], "%#lx");
+                       printnum_ptr(tcp, tcp->u_arg[1]);
                break;
 
        case PR_GET_TSC:
@@ -292,7 +292,7 @@ SYS_FUNC(arch_prctl)
                if (entering(tcp))
                        tprints(", ");
                else
-                       printnum_long(tcp, tcp->u_arg[1], "%#lx");
+                       printnum_ptr(tcp, tcp->u_arg[1]);
                return 0;
        }
 
index deeb74171d7b0ca977771f18a97edb4af664f2fb..8629184260673c2daade1d7c1aea764f715ccb25 100644 (file)
--- a/process.c
+++ b/process.c
@@ -127,7 +127,7 @@ SYS_FUNC(ptrace)
 #ifdef IA64
                        return RVAL_HEX;
 #else
-                       printnum_long(tcp, tcp->u_arg[3], "%#lx");
+                       printnum_ptr(tcp, tcp->u_arg[3]);
                        break;
 #endif
                case PTRACE_GETSIGINFO: {
diff --git a/rtc.c b/rtc.c
index 0dd71f0dd323134018d1645136a87466daa14465..0806b0e43d2f6bef315ef42585190b6225992d8f 100644 (file)
--- a/rtc.c
+++ b/rtc.c
@@ -90,7 +90,7 @@ rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
                if (entering(tcp))
                        return 0;
                tprints(", ");
-               printnum_long(tcp, arg, "%lu");
+               printnum_ulong(tcp, arg);
                break;
        case RTC_WKALM_SET:
                decode_rtc_wkalrm(tcp, arg);
diff --git a/util.c b/util.c
index 04cf413a6d578a12b16e05fdae32c46525294d01..2a22caccbfd4053d2d99f1f9ab7509eed8c8e53a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -410,14 +410,23 @@ printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt)     \
        }                                                               \
 }
 
-DEF_PRINTNUM(long, long)
-DEF_PRINTPAIR(long, long)
 DEF_PRINTNUM(int, int)
 DEF_PRINTPAIR(int, int)
 DEF_PRINTNUM(short, short)
-#if SIZEOF_LONG != 8
 DEF_PRINTNUM(int64, uint64_t)
 DEF_PRINTPAIR(int64, uint64_t)
+
+#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+void
+printnum_long_int(struct tcb *tcp, const long addr,
+                 const char *fmt_long, const char *fmt_int)
+{
+       if (current_wordsize > sizeof(int)) {
+               printnum_int64(tcp, addr, fmt_long);
+       } else {
+               printnum_int(tcp, addr, fmt_int);
+       }
+}
 #endif
 
 const char *