X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/29f5205452a317d48d5b7ec5d8dac4abe704f2a2..e34f8ca2022e340d3c0e36260a0232fab306dfcc:/src/src/string.c diff --git a/src/src/string.c b/src/src/string.c index 6b7d9a067..50442bced 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2016 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* Miscellaneous string-handling functions. Some are not required for @@ -1077,7 +1077,13 @@ return g->s; * Add chars to string * *************************************************/ -void +/* Arguments: + g the grawable-string + p current end of data + count amount to grow by +*/ + +static void gstring_grow(gstring * g, int p, int count) { int oldsize = g->size; @@ -1102,13 +1108,7 @@ was the last item on the dynamic memory stack. This is the case if it matches store_last_get. */ if (!store_extend(g->s, oldsize, g->size)) - { - BOOL release_ok = store_last_get[store_pool] == g->s; - uschar *newstring = store_get(g->size); - memcpy(newstring, g->s, p); - if (release_ok) store_release(g->s); - g->s = newstring; - } + g->s = store_newblock(g->s, g->size, p); } @@ -1372,10 +1372,20 @@ while (*fp != 0) break; case 'p': - if (p >= last - 24) { yield = FALSE; goto END_FORMAT; } - strncpy(newformat, item_start, fp - item_start); - newformat[fp - item_start] = 0; - p += sprintf(CS p, newformat, va_arg(ap, void *)); + { + void * ptr; + if (p >= last - 24) { yield = FALSE; goto END_FORMAT; } + /* sprintf() saying "(nil)" for a null pointer seems unreliable. + Handle it explicitly. */ + if ((ptr = va_arg(ap, void *))) + { + strncpy(newformat, item_start, fp - item_start); + newformat[fp - item_start] = 0; + p += sprintf(CS p, newformat, ptr); + } + else + p += sprintf(CS p, "(nil)"); + } break; /* %f format is inherently insecure if the numbers that it may be