aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-07-07 13:18:57 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-07-07 13:19:27 +0300
commita52ab6c6c38e1dca047ada4d60249fb323942f0b (patch)
treeed114e1924a1f9aee07fc946543056c94b2f6400 /src
parent6c28bd628ede02dfb6e8a5520d0b43cd19c03b57 (diff)
downloadgrecs-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.c7
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;

Return to:

Send suggestions and report system problems to the System administrator.