Skip to content

Commit 2479ef0

Browse files
committed
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 <[email protected]> Signed-off-by: Elvira Khabirova <[email protected]>
1 parent f9b455c commit 2479ef0

File tree

10 files changed

+49
-41
lines changed

10 files changed

+49
-41
lines changed

aio.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,7 @@ SYS_FUNC(io_setup)
4343
if (entering(tcp))
4444
tprintf("%ld, ", tcp->u_arg[0]);
4545
else
46-
#ifdef X32
47-
printnum_int64(tcp, tcp->u_arg[1], "%" PRIu64);
48-
#else
49-
printnum_long(tcp, tcp->u_arg[1], "%lu");
50-
#endif
46+
printnum_ulong(tcp, tcp->u_arg[1]);
5147
return 0;
5248
}
5349

block.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,15 @@ block_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
165165
if (entering(tcp))
166166
return 0;
167167
tprints(", ");
168-
printnum_long(tcp, arg, "%ld");
168+
printnum_slong(tcp, arg);
169169
break;
170170

171171
/* returns an unsigned long */
172172
case BLKGETSIZE:
173173
if (entering(tcp))
174174
return 0;
175175
tprints(", ");
176-
printnum_long(tcp, arg, "%lu");
176+
printnum_ulong(tcp, arg);
177177
break;
178178

179179
#ifdef HAVE_BLKGETSIZE64

defs.h

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -534,24 +534,39 @@ extern void printnum_short(struct tcb *, long, const char *)
534534
ATTRIBUTE_FORMAT((printf, 3, 0));
535535
extern void printnum_int(struct tcb *, long, const char *)
536536
ATTRIBUTE_FORMAT((printf, 3, 0));
537-
extern void printnum_long(struct tcb *, long, const char *)
538-
ATTRIBUTE_FORMAT((printf, 3, 0));
539-
#if SIZEOF_LONG == 8
540-
# define printnum_int64 printnum_long
541-
#else
542537
extern void printnum_int64(struct tcb *, long, const char *)
543538
ATTRIBUTE_FORMAT((printf, 3, 0));
539+
540+
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
541+
extern void printnum_long_int(struct tcb *, long, const char *, const char *)
542+
ATTRIBUTE_FORMAT((printf, 3, 0))
543+
ATTRIBUTE_FORMAT((printf, 4, 0));
544+
# define printnum_slong(tcp, addr) \
545+
printnum_long_int((tcp), (addr), "%" PRId64, "%d")
546+
# define printnum_ulong(tcp, addr) \
547+
printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
548+
# define printnum_ptr(tcp, addr) \
549+
printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
550+
#elif SIZEOF_LONG > 4
551+
# define printnum_slong(tcp, addr) \
552+
printnum_int64((tcp), (addr), "%" PRId64)
553+
# define printnum_ulong(tcp, addr) \
554+
printnum_int64((tcp), (addr), "%" PRIu64)
555+
# define printnum_ptr(tcp, addr) \
556+
printnum_int64((tcp), (addr), "%#" PRIx64)
557+
#else
558+
# define printnum_slong(tcp, addr) \
559+
printnum_int((tcp), (addr), "%d")
560+
# define printnum_ulong(tcp, addr) \
561+
printnum_int((tcp), (addr), "%u")
562+
# define printnum_ptr(tcp, addr) \
563+
printnum_int((tcp), (addr), "%#x")
544564
#endif
565+
545566
extern void printpair_int(struct tcb *, long, const char *)
546567
ATTRIBUTE_FORMAT((printf, 3, 0));
547-
extern void printpair_long(struct tcb *, long, const char *)
548-
ATTRIBUTE_FORMAT((printf, 3, 0));
549-
#if SIZEOF_LONG == 8
550-
# define printpair_int64 printpair_long
551-
#else
552568
extern void printpair_int64(struct tcb *, long, const char *)
553569
ATTRIBUTE_FORMAT((printf, 3, 0));
554-
#endif
555570
extern void printpath(struct tcb *, long);
556571
extern void printpathn(struct tcb *, long, unsigned int);
557572
#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))

get_robust_list.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ SYS_FUNC(get_robust_list)
55
if (entering(tcp)) {
66
tprintf("%ld, ", (long) (pid_t) tcp->u_arg[0]);
77
} else {
8-
printnum_long(tcp, tcp->u_arg[1], "%#lx");
8+
printnum_ptr(tcp, tcp->u_arg[1]);
99
tprints(", ");
10-
printnum_long(tcp, tcp->u_arg[2], "%lu");
10+
printnum_ulong(tcp, tcp->u_arg[2]);
1111
}
1212
return 0;
1313
}

io.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -244,22 +244,13 @@ SYS_FUNC(pwritev)
244244
return RVAL_DECODED;
245245
}
246246

247-
static void
248-
print_off_t(struct tcb *tcp, long addr)
249-
{
250-
if (current_wordsize == sizeof(int))
251-
printnum_int(tcp, addr, "%u");
252-
else
253-
printnum_long(tcp, addr, "%lu");
254-
}
255-
256247
SYS_FUNC(sendfile)
257248
{
258249
printfd(tcp, tcp->u_arg[0]);
259250
tprints(", ");
260251
printfd(tcp, tcp->u_arg[1]);
261252
tprints(", ");
262-
print_off_t(tcp, tcp->u_arg[2]);
253+
printnum_ulong(tcp, tcp->u_arg[2]);
263254
tprintf(", %lu", tcp->u_arg[3]);
264255

265256
return RVAL_DECODED;

ipc.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,7 @@ SYS_FUNC(semctl)
244244
PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
245245
tprints(", ");
246246
if (indirect_ipccall(tcp)) {
247-
if (current_wordsize == sizeof(int))
248-
printnum_int(tcp, tcp->u_arg[3], "%#x");
249-
else
250-
printnum_long(tcp, tcp->u_arg[3], "%#lx");
247+
printnum_ptr(tcp, tcp->u_arg[3]);
251248
} else {
252249
tprintf("%#lx", tcp->u_arg[3]);
253250
}

prctl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ SYS_FUNC(prctl)
100100
if (entering(tcp))
101101
tprints(", ");
102102
else
103-
printnum_long(tcp, tcp->u_arg[1], "%#lx");
103+
printnum_ptr(tcp, tcp->u_arg[1]);
104104
break;
105105

106106
case PR_GET_TSC:
@@ -292,7 +292,7 @@ SYS_FUNC(arch_prctl)
292292
if (entering(tcp))
293293
tprints(", ");
294294
else
295-
printnum_long(tcp, tcp->u_arg[1], "%#lx");
295+
printnum_ptr(tcp, tcp->u_arg[1]);
296296
return 0;
297297
}
298298

process.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ SYS_FUNC(ptrace)
127127
#ifdef IA64
128128
return RVAL_HEX;
129129
#else
130-
printnum_long(tcp, tcp->u_arg[3], "%#lx");
130+
printnum_ptr(tcp, tcp->u_arg[3]);
131131
break;
132132
#endif
133133
case PTRACE_GETSIGINFO: {

rtc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ rtc_ioctl(struct tcb *tcp, const unsigned int code, const long arg)
9090
if (entering(tcp))
9191
return 0;
9292
tprints(", ");
93-
printnum_long(tcp, arg, "%lu");
93+
printnum_ulong(tcp, arg);
9494
break;
9595
case RTC_WKALM_SET:
9696
decode_rtc_wkalrm(tcp, arg);

util.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,14 +410,23 @@ printpair_ ## name(struct tcb *tcp, const long addr, const char *fmt) \
410410
} \
411411
}
412412

413-
DEF_PRINTNUM(long, long)
414-
DEF_PRINTPAIR(long, long)
415413
DEF_PRINTNUM(int, int)
416414
DEF_PRINTPAIR(int, int)
417415
DEF_PRINTNUM(short, short)
418-
#if SIZEOF_LONG != 8
419416
DEF_PRINTNUM(int64, uint64_t)
420417
DEF_PRINTPAIR(int64, uint64_t)
418+
419+
#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
420+
void
421+
printnum_long_int(struct tcb *tcp, const long addr,
422+
const char *fmt_long, const char *fmt_int)
423+
{
424+
if (current_wordsize > sizeof(int)) {
425+
printnum_int64(tcp, addr, fmt_long);
426+
} else {
427+
printnum_int(tcp, addr, fmt_int);
428+
}
429+
}
421430
#endif
422431

423432
const char *

0 commit comments

Comments
 (0)