diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-07-07 13:18:57 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-07-07 13:19:27 +0300 |
commit | a52ab6c6c38e1dca047ada4d60249fb323942f0b (patch) | |
tree | ed114e1924a1f9aee07fc946543056c94b2f6400 /src | |
parent | 6c28bd628ede02dfb6e8a5520d0b43cd19c03b57 (diff) | |
download | grecs-a52ab6c6c38e1dca047ada4d60249fb323942f0b.tar.gz grecs-a52ab6c6c38e1dca047ada4d60249fb323942f0b.tar.bz2 |
Bugfix.
* src/asprintf.c (grecs_vasprintf): Operate on a fresh copy of va_alist
in each new iteration.
Diffstat (limited to 'src')
-rw-r--r-- | src/asprintf.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/asprintf.c b/src/asprintf.c index d493fcb..3165db5 100644 --- a/src/asprintf.c +++ b/src/asprintf.c @@ -36,13 +36,18 @@ grecs_vasprintf(char **pbuf, size_t *psize, const char *fmt, va_list ap) buf = calloc(1, buflen); if (buf == NULL) return ENOMEM; } for (;;) { - ssize_t n = vsnprintf(buf, buflen, fmt, ap); + va_list aq; + ssize_t n; + + va_copy(aq, ap); + n = vsnprintf(buf, buflen, fmt, aq); + va_end(aq); if (n < 0 || n >= buflen || !memchr(buf, '\0', n + 1)) { char *newbuf; size_t newlen = buflen * 2; if (newlen < buflen) { rc = ENOMEM; break; |