--- rpl/src/asprintf.c 2010/02/10 10:14:18 1.4 +++ rpl/src/asprintf.c 2010/02/28 14:47:14 1.5 @@ -29,27 +29,32 @@ valsprintf(unsigned char **strp, const c { size_t bs; size_t s; + unsigned char *b = NULL; + va_list cap; + for(bs = 1024;; bs *= 2) { + va_copy(cap, ap); + if (b != NULL) { free(b); } - if ((b = malloc(sizeof(*b) * bs)) == NULL) + if ((b = malloc(sizeof(*b) * bs)) == NULL) { return -1; } - if (((int) (s = vsnprintf(b, bs, fmt, ap))) < 0) + if (((int) (s = vsnprintf(b, bs, fmt, cap))) < 0) { free(b); return -1; } - if (s < bs) + if (s < bs) { break; }