]> granicus.if.org Git - strace/commitdiff
Print offsets in lseek and _llseek syscalls as signed integers
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 15 Feb 2016 18:30:02 +0000 (18:30 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 16 Feb 2016 01:35:36 +0000 (01:35 +0000)
* lseek.c (SYS_FUNC(lseek)): Print offset using %lld format.
(SYS_FUNC(llseek)): Likewise.  Treat high and low components of offset
as unsigned long integers.
* tests/llseek.c (main): Check that negative offset is printed properly.
* tests/lseek.c (main): Likewise.

lseek.c
tests/llseek.c
tests/lseek.c

diff --git a/lseek.c b/lseek.c
index fe4b695c6ddbc2a217b25989a71c8af75105d2a0..cfc6b586e9675b33167a6a629f328cbecd084cce 100644 (file)
--- a/lseek.c
+++ b/lseek.c
@@ -7,7 +7,7 @@
  * Copyright (c) 2009 Andreas Schwab <schwab@redhat.com>
  * Copyright (c) 2012 H.J. Lu <hongjiu.lu@intel.com>
  * Copyright (c) 2013 Denys Vlasenko <vda.linux@googlemail.com>
- * Copyright (c) 2014-2015 Dmitry V. Levin <ldv@altlinux.org>
+ * Copyright (c) 2014-2016 Dmitry V. Levin <ldv@altlinux.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #if defined(LINUX_MIPSN32) || defined(X32)
 SYS_FUNC(lseek)
 {
-       long long offset;
-       int whence;
-
        printfd(tcp, tcp->u_arg[0]);
+
+       long long offset;
 # ifdef X32
        /* tcp->ext_arg is not initialized for i386 personality */
        if (current_personality == 1)
@@ -58,11 +57,9 @@ SYS_FUNC(lseek)
        else
 # endif
        offset = tcp->ext_arg[1];
-       whence = tcp->u_arg[2];
-       if (whence == SEEK_SET)
-               tprintf(", %llu, ", offset);
-       else
-               tprintf(", %lld, ", offset);
+       int whence = tcp->u_arg[2];
+
+       tprintf(", %lld, ", offset);
        printxval(whence_codes, whence, "SEEK_???");
 
        return RVAL_DECODED | RVAL_LUDECIMAL;
@@ -70,16 +67,23 @@ SYS_FUNC(lseek)
 #else
 SYS_FUNC(lseek)
 {
-       long offset;
-       int whence;
-
        printfd(tcp, tcp->u_arg[0]);
-       offset = tcp->u_arg[1];
-       whence = tcp->u_arg[2];
-       if (whence == SEEK_SET)
-               tprintf(", %lu, ", offset);
-       else
-               tprintf(", %ld, ", offset);
+
+       long offset =
+# if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+#  ifdef X86_64
+               current_personality == 1 ?
+                       (long)(int) tcp->u_arg[1] : tcp->u_arg[1];
+#  else
+               current_wordsize == 4 ?
+                       (long)(int) tcp->u_arg[1] : tcp->u_arg[1];
+#  endif
+# else
+               tcp->u_arg[1];
+# endif
+       int whence = tcp->u_arg[2];
+
+       tprintf(", %ld, ", offset);
        printxval(whence_codes, whence, "SEEK_???");
 
        return RVAL_DECODED | RVAL_UDECIMAL;
@@ -103,14 +107,9 @@ SYS_FUNC(llseek)
 {
        if (entering(tcp)) {
                printfd(tcp, tcp->u_arg[0]);
-               if (tcp->u_arg[4] == SEEK_SET)
-                       tprintf(", %llu, ",
-                               ((long long) tcp->u_arg[1]) << 32 |
-                               (unsigned long long) (unsigned) tcp->u_arg[2]);
-               else
-                       tprintf(", %lld, ",
-                               ((long long) tcp->u_arg[1]) << 32 |
-                               (unsigned long long) (unsigned) tcp->u_arg[2]);
+               tprintf(", %lld, ",
+                       ((unsigned long long) (unsigned long) tcp->u_arg[1]) << 32
+                       | (unsigned long long) (unsigned long) tcp->u_arg[2]);
        } else {
                printnum_int64(tcp, tcp->u_arg[3], "%" PRIu64);
                tprints(", ");
index a9d1914a2ac751f3beaf36eb25052e7ecfd302f2..2f691711a2f1f2eba8e38c09386f2f5617c30fb1 100644 (file)
 int
 main(void)
 {
-       const unsigned long high = 0xdefaced;
+       const unsigned long high = 0xfacefeed;
        const unsigned long low = 0xdeadbeef;
-       const unsigned long long offset = 0xdefaceddeadbeef;
+       const long long offset = 0xfacefeeddeadbeefLL;
        unsigned long long result;
 
        assert(syscall(__NR__llseek, -1, high, low, &result, SEEK_SET) == -1);
        if (EBADF != errno)
                perror_msg_and_skip("_llseek");
 
-       printf("_llseek(-1, %llu, %p, SEEK_SET) = -1 EBADF (%m)\n",
+       printf("_llseek(-1, %lld, %p, SEEK_SET) = -1 EBADF (%m)\n",
               offset, &result);
 
        puts("+++ exited with 0 +++");
index 9dcf0cadec698f69c490e9068126ca7813831063..227c4e301a2a26ea54de6dc62c25f84814026b9c 100644 (file)
@@ -39,7 +39,7 @@
 int
 main(void)
 {
-       const kernel_ulong_t offset = (kernel_ulong_t) 0xdefaced0badc0deULL;
+       const kernel_ulong_t offset = (kernel_ulong_t) 0xfacefeeddeadbeefULL;
 
        if (sizeof(offset) > sizeof(long))
                assert(lseek(-1, offset, SEEK_SET) == -1);
@@ -49,8 +49,12 @@ main(void)
        if (EBADF != errno)
                perror_msg_and_skip("lseek");
 
-       printf("lseek(-1, %llu, SEEK_SET) = -1 EBADF (%m)\n",
-              (unsigned long long) offset);
+       if (sizeof(offset) > sizeof(long))
+               printf("lseek(-1, %lld, SEEK_SET) = -1 EBADF (%m)\n",
+                      (long long) offset);
+       else
+               printf("lseek(-1, %ld, SEEK_SET) = -1 EBADF (%m)\n",
+                      (long) offset);
 
        puts("+++ exited with 0 +++");
        return 0;