]> granicus.if.org Git - strace/commitdiff
2007-08-01 Roland McGrath <roland@redhat.com>
authorRoland McGrath <roland@redhat.com>
Thu, 2 Aug 2007 02:13:05 +0000 (02:13 +0000)
committerRoland McGrath <roland@redhat.com>
Thu, 2 Aug 2007 02:13:05 +0000 (02:13 +0000)
* process.c (printargv): Handle boundary cases correctly.
Handle biarch fetching correctly.

process.c

index 12d643bba6698c62baac4fb6ebab635e03ec3ed9..653815461bfa724231e74f0a89b677712a351791 100644 (file)
--- a/process.c
+++ b/process.c
@@ -1677,25 +1677,31 @@ printargv(tcp, addr)
 struct tcb *tcp;
 long addr;
 {
-       char *cp;
+       union {
+               int p32;
+               long p64;
+               char data[sizeof(long)];
+       } cp;
        char *sep;
-       int max = max_strlen / 2;
+       int n = 0;
 
-       for (sep = ""; --max >= 0; sep = ", ") {
-               if (!abbrev(tcp))
-                       max++;
-               if (umove(tcp, addr, &cp) < 0) {
+       cp.p64 = 1;
+       for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
+               if (umoven(tcp, addr, personality_wordsize[current_personality],
+                          cp.data) < 0) {
                        tprintf("%#lx", addr);
                        return;
                }
-               if (cp == 0)
+               if (personality_wordsize[current_personality] == 4)
+                       cp.p64 = cp.p32;
+               if (cp.p64 == 0)
                        break;
                tprintf(sep);
-               printstr(tcp, (long) cp, -1);
-               addr += sizeof(char *);
+               printstr(tcp, cp.p64, -1);
+               addr += personality_wordsize[current_personality];
        }
-       if (cp)
-               tprintf(", ...");
+       if (cp.p64)
+               tprintf("%s...", sep);
 }
 
 static void