If the initial darr capacity is not enough for the output, the `ap` is
reused multiple times, which is wrong, because it may be altered by
`vsnprintf`. Make a copy of `ap` each time instead of reusing.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
(cherry picked from commit
ee0c1cc1e4b87bde73f1eba3212ab93b1c379c6c)
size_t inlen = concat ? darr_strlen(*sp) : 0;
size_t capcount = strlen(fmt) + MIN(inlen + 64, 128);
ssize_t len;
+ va_list ap_copy;
darr_ensure_cap(*sp, capcount);
if (darr_len(*sp) == 0)
*darr_append(*sp) = 0;
again:
- len = vsnprintf(darr_last(*sp), darr_avail(*sp), fmt, ap);
+ va_copy(ap_copy, ap);
+ len = vsnprintf(darr_last(*sp), darr_avail(*sp), fmt, ap_copy);
+ va_end(ap_copy);
if (len < 0)
darr_in_strcat(*sp, fmt);
else if ((size_t)len < darr_avail(*sp))