From fde2e04b05f535a43f936f079e1e0c15b351702c Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 21 Dec 2000 22:21:38 +0000 Subject: Fix printf(1) for cases where a long string with no format specifiers is followed by a %d (probably others too) format specifier. Reviewed by: audit --- usr.bin/printf/printf.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'usr.bin/printf') diff --git a/usr.bin/printf/printf.c b/usr.bin/printf/printf.c index 62b8912..4b01b4a 100644 --- a/usr.bin/printf/printf.c +++ b/usr.bin/printf/printf.c @@ -60,6 +60,7 @@ static const char rcsid[] = #ifdef SHELL #define main printfcmd #include "bltin/bltin.h" +#include "memalloc.h" #else #define warnx1(a, b, c) warnx(a) #define warnx2(a, b, c) warnx(a, b) @@ -247,12 +248,23 @@ mklong(str, ch) char *str; int ch; { - static char copy[64]; - int len; + static char *copy; + static size_t copy_size; + size_t len, newlen; + char *newcopy; len = strlen(str) + 2; - if (len > sizeof copy) - return NULL; + if (len > copy_size) { + newlen = ((len + 1023) >> 10) << 10; +#ifdef SHELL + if ((newcopy = ckrealloc(copy, newlen)) == NULL) +#else + if ((newcopy = realloc(copy, newlen)) == NULL) +#endif + return (NULL); + copy = newcopy; + copy_size = newlen; + } memmove(copy, str, len - 3); copy[len - 3] = 'q'; -- cgit v1.1