If the buffer is completely full, the function chunk_appendf() would
write a zero past it, which can result in unexpected behavior.
Now we make a check before calling vsnprintf() and return the current
chunk size if no room is available.
This should be backported as far as 2.0.
int chunk_appendf(struct buffer *chk, const char *fmt, ...)
{
va_list argp;
+ size_t room;
int ret;
if (!chk->area || !chk->size)
return 0;
+ room = chk->size - chk->data;
+ if (!room)
+ return chk->data;
+
va_start(argp, fmt);
- ret = vsnprintf(chk->area + chk->data, chk->size - chk->data, fmt,
- argp);
- if (ret >= chk->size - chk->data)
+ ret = vsnprintf(chk->area + chk->data, room, fmt, argp);
+ if (ret >= room)
/* do not copy anything in case of truncation */
chk->area[chk->data] = 0;
else