va_list must be saved when calling vsnprintf() in a loop.
char *nbuf;
int guess = 128;
int length = 0;
+ va_list orig, aq;
int ret;
if (fmt == NULL) {
return -1;
}
+ va_copy (orig, ap);
for (;;) {
nbuf = realloc (buf, guess);
if (!nbuf) {
free (buf);
+ va_end (orig);
return -1;
}
buf = nbuf;
length = guess;
- ret = vsnprintf (buf, length, fmt, ap);
+ va_copy (aq, orig);
+ ret = vsnprintf (buf, length, fmt, aq);
+ va_end (aq);
if (ret < 0)
guess *= 2;
else
break;
}
+ va_end (orig);
*strp = buf;
return ret;