From: Dmitry V. Levin Date: Thu, 7 Aug 2014 00:07:28 +0000 (+0000) Subject: Fix preadv/pwritev offset decoding on bigendian architectures X-Git-Tag: v4.9~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3c49b02e98af0aabfffd20fd8b34b1f71b8cffb9;p=strace Fix preadv/pwritev offset decoding on bigendian architectures This partially reverts commit 7845a42b39e59e904d01e75e21f7bc7eb6462560. * util.c (printllval): Remove align argument. * defs.h (printllval): Update prototype. (printllval_aligned, printllval_unaligned): Remove. * file.c (sys_readahead, sys_truncate64, sys_ftruncate64, sys_fadvise64, sys_fadvise64_64, sys_sync_file_range, sys_sync_file_range2, sys_fallocate): Replace printllval_aligned call with printllval. * io.c (sys_pread, sys_pwrite): Likewise. (print_llu_from_low_high_val): New function. (sys_preadv, sys_pwritev): Use it instead of printllval_unaligned. --- diff --git a/defs.h b/defs.h index 1a3b4837..b92fa7b7 100644 --- a/defs.h +++ b/defs.h @@ -663,11 +663,7 @@ extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_b # define LONG_LONG(a,b) \ ((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32))) #endif -extern int printllval(struct tcb *, const char *, int, bool); -#define printllval_aligned(tcp, fmt, arg) \ - printllval((tcp), (fmt), (arg), true) -#define printllval_unaligned(tcp, fmt, arg) \ - printllval((tcp), (fmt), (arg), false) +extern int printllval(struct tcb *, const char *, int); extern void printxval(const struct xlat *, int, const char *); extern int printargs(struct tcb *); diff --git a/file.c b/file.c index a92a7dcb..360408f3 100644 --- a/file.c +++ b/file.c @@ -480,7 +480,7 @@ sys_readahead(struct tcb *tcp) if (entering(tcp)) { int argn; printfd(tcp, tcp->u_arg[0]); - argn = printllval_aligned(tcp, ", %lld", 1); + argn = printllval(tcp, ", %lld", 1); tprintf(", %ld", tcp->u_arg[argn]); } return 0; @@ -501,7 +501,7 @@ sys_truncate64(struct tcb *tcp) { if (entering(tcp)) { printpath(tcp, tcp->u_arg[0]); - printllval_aligned(tcp, ", %llu", 1); + printllval(tcp, ", %llu", 1); } return 0; } @@ -521,7 +521,7 @@ sys_ftruncate64(struct tcb *tcp) { if (entering(tcp)) { printfd(tcp, tcp->u_arg[0]); - printllval_aligned(tcp, ", %llu", 1); + printllval(tcp, ", %llu", 1); } return 0; } @@ -2419,7 +2419,7 @@ sys_fadvise64(struct tcb *tcp) if (entering(tcp)) { int argn; printfd(tcp, tcp->u_arg[0]); - argn = printllval_aligned(tcp, ", %lld", 1); + argn = printllval(tcp, ", %lld", 1); tprintf(", %ld, ", tcp->u_arg[argn++]); printxval(advise, tcp->u_arg[argn], "POSIX_FADV_???"); } @@ -2432,8 +2432,8 @@ sys_fadvise64_64(struct tcb *tcp) if (entering(tcp)) { int argn; printfd(tcp, tcp->u_arg[0]); - argn = printllval_aligned(tcp, ", %lld, ", 1); - argn = printllval_aligned(tcp, "%lld, ", argn); + argn = printllval(tcp, ", %lld, ", 1); + argn = printllval(tcp, "%lld, ", argn); #if defined __ARM_EABI__ || defined AARCH64 || defined POWERPC || defined XTENSA printxval(advise, tcp->u_arg[1], "POSIX_FADV_???"); #else @@ -2451,8 +2451,8 @@ sys_sync_file_range(struct tcb *tcp) if (entering(tcp)) { int argn; printfd(tcp, tcp->u_arg[0]); - argn = printllval_aligned(tcp, ", %lld, ", 1); - argn = printllval_aligned(tcp, "%lld, ", argn); + argn = printllval(tcp, ", %lld, ", 1); + argn = printllval(tcp, "%lld, ", argn); printflags(sync_file_range_flags, tcp->u_arg[argn], "SYNC_FILE_RANGE_???"); } @@ -2467,8 +2467,8 @@ sys_sync_file_range2(struct tcb *tcp) printfd(tcp, tcp->u_arg[0]); printflags(sync_file_range_flags, 1, "SYNC_FILE_RANGE_???"); - argn = printllval_aligned(tcp, ", %lld, ", 2); - argn = printllval_aligned(tcp, "%lld, ", argn); + argn = printllval(tcp, ", %lld, ", 2); + argn = printllval(tcp, "%lld, ", argn); } return 0; } @@ -2480,8 +2480,8 @@ sys_fallocate(struct tcb *tcp) int argn; printfd(tcp, tcp->u_arg[0]); /* fd */ tprintf(", %#lo, ", tcp->u_arg[1]); /* mode */ - argn = printllval_aligned(tcp, "%llu, ", 2); /* offset */ - printllval_aligned(tcp, "%llu", argn); /* len */ + argn = printllval(tcp, "%llu, ", 2); /* offset */ + printllval(tcp, "%llu", argn); /* len */ } return 0; } diff --git a/io.c b/io.c index fea12188..43777773 100644 --- a/io.c +++ b/io.c @@ -199,7 +199,7 @@ sys_pread(struct tcb *tcp) else printstr(tcp, tcp->u_arg[1], tcp->u_rval); tprintf(", %lu, ", tcp->u_arg[2]); - printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG); + printllval(tcp, "%llu", PREAD_OFFSET_ARG); } return 0; } @@ -212,12 +212,32 @@ sys_pwrite(struct tcb *tcp) tprints(", "); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu, ", tcp->u_arg[2]); - printllval_aligned(tcp, "%llu", PREAD_OFFSET_ARG); + printllval(tcp, "%llu", PREAD_OFFSET_ARG); } return 0; } #if HAVE_SYS_UIO_H + +static void +print_llu_from_low_high_val(struct tcb *tcp, int arg) +{ +#if SIZEOF_LONG == SIZEOF_LONG_LONG + tprintf("%llu", (unsigned long long) tcp->u_arg[arg]); +#elif defined(LINUX_MIPSN32) + tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]); +#else +# ifdef X32 + if (current_personality == 0) + tprintf("%llu", (unsigned long long) tcp->ext_arg[arg]); + else +# endif + tprintf("%llu", + ((unsigned long long) tcp->u_arg[arg + 1] << (sizeof(long) * 8)) + | (unsigned long long) tcp->u_arg[arg]); +#endif +} + int sys_preadv(struct tcb *tcp) { @@ -231,7 +251,7 @@ sys_preadv(struct tcb *tcp) } tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); tprintf(", %lu, ", tcp->u_arg[2]); - printllval_unaligned(tcp, "%llu", 3); + print_llu_from_low_high_val(tcp, 3); } return 0; } @@ -244,7 +264,7 @@ sys_pwritev(struct tcb *tcp) tprints(", "); tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1], 1); tprintf(", %lu, ", tcp->u_arg[2]); - printllval_unaligned(tcp, "%llu", 3); + print_llu_from_low_high_val(tcp, 3); } return 0; } diff --git a/util.c b/util.c index 33482d5f..c78e962c 100644 --- a/util.c +++ b/util.c @@ -225,7 +225,7 @@ printxval(const struct xlat *xlat, int val, const char *dflt) * argument. */ int -printllval(struct tcb *tcp, const char *format, int arg_no, bool align) +printllval(struct tcb *tcp, const char *format, int arg_no) { #if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG # if SUPPORTED_PERSONALITIES > 1 @@ -236,10 +236,8 @@ printllval(struct tcb *tcp, const char *format, int arg_no, bool align) # if SUPPORTED_PERSONALITIES > 1 } else { # if defined(AARCH64) || defined(POWERPC64) - if (align) { - /* Align arg_no to the next even number. */ - arg_no = (arg_no + 1) & 0xe; - } + /* Align arg_no to the next even number. */ + arg_no = (arg_no + 1) & 0xe; # endif tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1])); arg_no += 2; @@ -263,10 +261,8 @@ printllval(struct tcb *tcp, const char *format, int arg_no, bool align) defined LINUX_MIPSO32 || \ defined POWERPC || \ defined XTENSA - if (align) { - /* Align arg_no to the next even number. */ - arg_no = (arg_no + 1) & 0xe; - } + /* Align arg_no to the next even number. */ + arg_no = (arg_no + 1) & 0xe; # endif tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1])); arg_no += 2;