From 2c692092dfcca0f4c0270b15eb6091dc59d67bc4 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Fri, 23 Feb 2018 13:19:43 -0800 Subject: [PATCH] Rework str_vasprintf(). --- src/util-string.c | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/src/util-string.c b/src/util-string.c index 2cbbdf35..48035691 100644 --- a/src/util-string.c +++ b/src/util-string.c @@ -554,39 +554,29 @@ str_asprintf (const char *fmt, ...) return len == -1 ? NULL : result; } -#define BUFSIZE 128 int str_vasprintf (char **result, const char *fmt, va_list ap) { - size_t alloc = BUFSIZE; char *buf = NULL; - int len; + int len, len2; + va_list cp; - for (;;) - { - char *p = pwmd_realloc (buf, alloc * sizeof (char)); - va_list cp; + va_copy (cp, ap); + len = vsnprintf (NULL, 0, fmt, cp); + va_end (cp); - if (!p) - { - pwmd_free (buf); - return -1; - } - - buf = p; - va_copy (cp, ap); - len = vsnprintf (buf, alloc, fmt, cp); - va_end (cp); + buf = pwmd_malloc (++len); + if (!buf) + return -1; - if (len >= alloc) - { - alloc = len + 1; - continue; - } - - break; + va_copy (cp, ap); + len2 = vsnprintf (buf, len, fmt, cp); + va_end (cp); + if (len-1 != len2) + { + pwmd_free (buf); + return -1; } - *result = buf; - return len; + return len2; } -- 2.11.4.GIT