mirror of
https://github.com/libevent/libevent.git
synced 2025-01-09 00:56:20 +08:00
buffer: evbuffer_add_buffer(): clean empty chains from destination buffer
@EMPanisset reported a problem (#358) with evbuffer_remove_buffer(), but actually I think that the problem is in evbuffer_add_buffer() which introduces this empty chain, all other callers (except evbuffer_prepend_buffer(), but it doesn't have this problem though) should be safe. And FWIW the only API that allows empty chains is evbuffer_add_reference(), and we can add check there to avoid such issues, but for now I leaved this without fixing, since I think that evbuffer_add_reference() with empty chains can be used as a barrier (but this can be tricky). Fixes: regress evbuffer/remove_buffer_with_empty2 v2: introduce/fixes evbuffer/add_buffer_with_empty
This commit is contained in:
parent
a272bc4227
commit
26fd9321cf
8
buffer.c
8
buffer.c
@ -885,9 +885,13 @@ APPEND_CHAIN(struct evbuffer *dst, struct evbuffer *src)
|
||||
{
|
||||
ASSERT_EVBUFFER_LOCKED(dst);
|
||||
ASSERT_EVBUFFER_LOCKED(src);
|
||||
dst->last->next = src->first;
|
||||
|
||||
struct evbuffer_chain **chp;
|
||||
chp = evbuffer_free_trailing_empty_chains(dst);
|
||||
*chp = src->first;
|
||||
|
||||
if (src->last_with_datap == &src->first)
|
||||
dst->last_with_datap = &dst->last->next;
|
||||
dst->last_with_datap = chp;
|
||||
else
|
||||
dst->last_with_datap = src->last_with_datap;
|
||||
dst->last = src->last;
|
||||
|
Loading…
x
Reference in New Issue
Block a user