summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJones Desougi <jones.desougi@27m.se>2010-06-10 15:04:51 +0200
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2011-02-09 20:17:28 +0100
commit9a9a6365d5c5abb0fe3ec6cc09542e9c7e1d3bec (patch)
tree973272267e7ab2571a773c8563331a162bc9b30c
parent6f810c757e5b14a97f05652972e91f95e321a404 (diff)
*printf: Violation of precision with null string
When a string format is processed and the argument is NULL, this yields "(null)" regardless of precision. This does not make sense, precision should not be exceeded. A simple test shows that glibc outputs nothing if precision is smaller than six and the attached patch implements this same behaviour. Consider the not uncommon case of strings implemented like this: struct string { int len; char *ptr; }; There is often no nultermination and they may be printed like this: printf("%.*s", string.len, string.ptr); If len is 0 then ptr may be anything, but NULL is a common value. Obviously the empty string would be expected, not "(null)". Signed-off-by: Jones Desougi <jones.desougi@27m.se> Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
-rw-r--r--libc/stdio/_vfprintf.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/libc/stdio/_vfprintf.c b/libc/stdio/_vfprintf.c
index 3b007084d..fa5dc44fc 100644
--- a/libc/stdio/_vfprintf.c
+++ b/libc/stdio/_vfprintf.c
@@ -1670,6 +1670,9 @@ static int _do_one_spec(FILE * __restrict stream,
#endif
s = "(null)";
slen = 6;
+ /* Use an empty string rather than truncation if precision is too small. */
+ if (ppfs->info.prec >= 0 && ppfs->info.prec < slen)
+ slen = 0;
}
} else { /* char */
s = buf;
@@ -1726,6 +1729,9 @@ static int _do_one_spec(FILE * __restrict stream,
NULL_STRING:
s = "(null)";
SLEN = slen = 6;
+ /* Use an empty string rather than truncation if precision is too small. */
+ if (ppfs->info.prec >= 0 && ppfs->info.prec < slen)
+ SLEN = slen = 0;
}
} else { /* char */
*wbuf = btowc( (unsigned char)(*((const int *) *argptr)) );