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 <ldv@altlinux.org>
Signed-off-by: Elvira Khabirova <lineprinter0@gmail.com>
This commit is contained in:
Дмитрий Левин 2015-08-18 14:58:27 +00:00
parent f9b455cfd2
commit 2479ef0bce
10 changed files with 49 additions and 41 deletions

6
aio.c
View File

@ -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;
}

View File

@ -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

37
defs.h
View File

@ -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}"))

View 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;
}

11
io.c
View File

@ -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;

5
ipc.c
View File

@ -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]);
}

View File

@ -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;
}

View File

@ -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: {

2
rtc.c
View File

@ -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);

15
util.c
View File

@ -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 *