mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
BUG/MINOR: chunk: fix chunk_appendf() to not write a zero if buffer is full
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.
This commit is contained in:
parent
c156c5bda6
commit
f7596209ee
10
src/chunk.c
10
src/chunk.c
@ -130,15 +130,19 @@ int chunk_printf(struct buffer *chk, const char *fmt, ...)
|
|||||||
int chunk_appendf(struct buffer *chk, const char *fmt, ...)
|
int chunk_appendf(struct buffer *chk, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list argp;
|
va_list argp;
|
||||||
|
size_t room;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!chk->area || !chk->size)
|
if (!chk->area || !chk->size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
room = chk->size - chk->data;
|
||||||
|
if (!room)
|
||||||
|
return chk->data;
|
||||||
|
|
||||||
va_start(argp, fmt);
|
va_start(argp, fmt);
|
||||||
ret = vsnprintf(chk->area + chk->data, chk->size - chk->data, fmt,
|
ret = vsnprintf(chk->area + chk->data, room, fmt, argp);
|
||||||
argp);
|
if (ret >= room)
|
||||||
if (ret >= chk->size - chk->data)
|
|
||||||
/* do not copy anything in case of truncation */
|
/* do not copy anything in case of truncation */
|
||||||
chk->area[chk->data] = 0;
|
chk->area[chk->data] = 0;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user