2007-11-01 Roland McGrath <roland@redhat.com>
* util.c (string_quote): Return nonzero if the string was unterminated.
(printstr): Use that value instead of just our own test.
(printpathn): Likewise.
Fixes RH#358241.
diff --git a/util.c b/util.c
index 461b9da..70011e2 100644
--- a/util.c
+++ b/util.c
@@ -407,7 +407,7 @@
static char path[MAXPATHLEN + 1];
-static void
+static int
string_quote(const char *instr, char *outstr, int len, int size)
{
const unsigned char *ustr = (const unsigned char *) instr;
@@ -419,6 +419,8 @@
else if (xflag) {
for (i = 0; i < size; ++i) {
c = ustr[i];
+ if (len < 0 && i == size - 2 && c != '\0')
+ ++i;
if (len < 0 && c == '\0')
break;
if (!isprint(c) && !isspace(c)) {
@@ -441,6 +443,8 @@
} else {
for (i = 0; i < size; ++i) {
c = ustr[i];
+ if (len < 0 && i == size - 2 && c != '\0')
+ ++i;
if (len < 0 && c == '\0')
break;
switch (c) {
@@ -486,6 +490,9 @@
*s++ = '\"';
*s = '\0';
+
+ /* Return nonzero if the string was unterminated. */
+ return i == size;
}
void
@@ -508,8 +515,7 @@
if (trunc)
path[n] = '\0';
- string_quote(path, outstr, -1, n);
- if (trunc)
+ if (string_quote(path, outstr, -1, n + 1) || trunc)
strcat(outstr, "...");
tprintf("%s", outstr);
}
@@ -526,7 +532,7 @@
{
static char *str = NULL;
static char *outstr;
- int size, trunc;
+ int size;
if (!addr) {
tprintf("NULL");
@@ -557,9 +563,7 @@
}
}
- trunc = size > max_strlen && str[--size] != 0;
- string_quote(str, outstr, len, size);
- if (size < len || (len < 0 && trunc))
+ if (string_quote(str, outstr, len, size))
strcat(outstr, "...");
tprintf("%s", outstr);