From dbca2135f5b2a0e07d80c438bbbebe430d7c7bdc Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Thu, 29 Dec 2016 12:39:42 -0500 Subject: [PATCH] Rework str_vasprintf(). --- src/util-string.c | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/util-string.c b/src/util-string.c index a60115ed..86162b66 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; + va_list cp; - for (;;) - { - char *p = xrealloc (buf, alloc * sizeof (char)); - va_list cp; + va_copy (cp, ap); + len = vsnprintf (NULL, 0, fmt, cp); + va_end (cp); - if (!p) - { - xfree (buf); - return -1; - } + buf = xmalloc (++len); + if (!buf) + return -1; - buf = p; - va_copy (cp, ap); - len = vsnprintf (buf, alloc, fmt, cp); - va_end (cp); - - if (len >= alloc) - { - alloc = len + 1; - continue; - } - - break; + va_copy (cp, ap); + len = vsnprintf (buf, len, fmt, cp); + va_end (cp); + if (len == -1) + { + xfree (buf); + return len; } - *result = buf; return len; } -- 2.11.4.GIT