]> granicus.if.org Git - strace/commitdiff
Fix preadv/pwritev offset decoding on bigendian architectures
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 7 Aug 2014 00:07:28 +0000 (00:07 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 7 Aug 2014 00:30:26 +0000 (00:30 +0000)
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.

defs.h
file.c
io.c
util.c

diff --git a/defs.h b/defs.h
index 1a3b48376360c268d2ae050cb5083823a7966529..b92fa7b753d33ea2089d7aa235a2b22806adeb08 100644 (file)
--- 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 a92a7dcb1e85c03046e0876cd777df43406d5fb7..360408f39725acbdd741ee51b4e63183a8909dd0 100644 (file)
--- 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 fea121886cc637e8fe76677efe1ba584cdb90aaa..4377777331fb39b29cf71766e6affc8aab804e5b 100644 (file)
--- 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 33482d5f501b826784c972e7542b640d51f9420c..c78e962c9d49d6499e65c01bf58736e6cd9298d1 100644 (file)
--- 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;