]> granicus.if.org Git - strace/commitdiff
printstr_ex: handle QUOTE_0_TERMINATED bit consistently
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 19 Nov 2016 21:01:03 +0000 (21:01 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 19 Nov 2016 21:01:03 +0000 (21:01 +0000)
When user_style has QUOTE_0_TERMINATED bit set, printstr_ex prints
the fetched string as a NUL-terminated.
After this change, the string is being fetched as a NUL-terminated, too.

* util.c (printstr_ex): Use umovestr instead of umoven
if QUOTE_0_TERMINATED bit is set.

util.c

diff --git a/util.c b/util.c
index 54a77e699d95a1177614d05fc448c5bc4e113564..0279705acdd978299b7f0aae18102cbc799220ce 100644 (file)
--- a/util.c
+++ b/util.c
@@ -827,8 +827,12 @@ printpath(struct tcb *tcp, long addr)
 
 /*
  * Print string specified by address `addr' and length `len'.
- * If `len' < 0, treat the string as a NUL-terminated string.
- * If string length exceeds `max_strlen', append `...' to the output.
+ * If `len' == -1, set QUOTE_0_TERMINATED bit in `user_style'.
+ * If `user_style' has QUOTE_0_TERMINATED bit set, treat the string
+ * as a NUL-terminated string.
+ * Pass `user_style' on to `string_quote'.
+ * Append `...' to the output if either the string length exceeds `max_strlen',
+ * or `len' != -1 and the string length exceeds `len'.
  */
 void
 printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
@@ -865,7 +869,10 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
        } else {
                if (size > (unsigned long) len)
                        size = (unsigned long) len;
-               rc = umoven(tcp, addr, size, str);
+               if (style & QUOTE_0_TERMINATED)
+                       rc = umovestr(tcp, addr, size, str);
+               else
+                       rc = umoven(tcp, addr, size, str);
        }
        if (rc < 0) {
                printaddr(addr);