From 52b85c6fdfad963affca6699bff4437fbfab01e2 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
Date: Sun, 20 Nov 2016 00:29:46 +0000
Subject: [PATCH] printstr_ex: fix handling of last byte when
 QUOTE_0_TERMINATED bit set

* util.c (printstr_ex): Simplify handling of size == 0 case.
Do not artificially decrement size when QUOTE_0_TERMINATED bit is set.
Ensure that str[size] byte is non-zero if it hasn't been fetched.
---
 util.c | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/util.c b/util.c
index 0279705a..e83f574a 100644
--- a/util.c
+++ b/util.c
@@ -879,23 +879,18 @@ printstr_ex(struct tcb *tcp, long addr, long len, unsigned int user_style)
 		return;
 	}
 
-	if (style & QUOTE_0_TERMINATED) {
-		if (size) {
-			--size;
-		} else {
-			tprints((len == -1) || (len == 0) ? "\"\"" : "\"\"...");
-			return;
-		}
-	}
 	if (size > max_strlen)
 		size = max_strlen;
+	else
+		str[size] = '\xff';
 
 	/* If string_quote didn't see NUL and (it was supposed to be ASCIZ str
 	 * or we were requested to print more than -s NUM chars)...
 	 */
-	ellipsis = (string_quote(str, outstr, size, style) &&
-			((style & QUOTE_0_TERMINATED) ||
-				(unsigned long) len > max_strlen));
+	ellipsis = string_quote(str, outstr, size, style)
+		   && len
+		   && ((style & QUOTE_0_TERMINATED)
+		       || (unsigned long) len > max_strlen);
 
 	tprints(outstr);
 	if (ellipsis)
-- 
2.40.0