From: Dmitry V. Levin Date: Tue, 18 Aug 2015 14:58:27 +0000 (+0000) Subject: Fix printing tracee's long integers X-Git-Tag: v4.11~276 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2479ef0bceaa35ea353fd0ea372cf31d5eb8a216;p=strace Fix printing tracee's long integers 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 Signed-off-by: Elvira Khabirova --- diff --git a/aio.c b/aio.c index fd10553f..3b6cf503 100644 --- 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 3b1de513..1e02fa71 100644 --- 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 29c2131e..857175de 100644 --- 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}")) diff --git a/get_robust_list.c b/get_robust_list.c index 02f81482..beec52b3 100644 --- a/get_robust_list.c +++ b/get_robust_list.c @@ -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 b701f81b..69198ad7 100644 --- 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 c868e607..ec491eb4 100644 --- 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 90efe16e..cfd117f1 100644 --- 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; } diff --git a/process.c b/process.c index deeb7417..86291842 100644 --- 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 0dd71f0d..0806b0e4 100644 --- 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 04cf413a..2a22cacc 100644 --- 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 *