From: Marcus Sundberg Date: Sat, 26 Mar 2016 19:11:43 +0000 (+0100) Subject: evbuffer_add: Use last_with_datap if set, not last. X-Git-Tag: release-2.1.6-beta~42^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a8769ef12d7e223e33fc47bed03fba2bfa2f3536;p=libevent evbuffer_add: Use last_with_datap if set, not last. evbuffer_add() would always put data in the last chain, even if there was available space in a previous chain, and in doing so it also failed to update last_with_datap, causing subsequent calls to other functions that do look at last_with_datap to add data in the middle of the evbuffer instead of at the end. Fixes the evbuffer_add() part of issue #335, and the evbuffer/add2 and evbuffer/add3 tests, and also prevents wasting space available in the chain pointed to by last_with_datap. --- diff --git a/buffer.c b/buffer.c index 7cca0e8a..f378b731 100644 --- a/buffer.c +++ b/buffer.c @@ -1732,7 +1732,11 @@ evbuffer_add(struct evbuffer *buf, const void *data_in, size_t datlen) goto done; } - chain = buf->last; + if (*buf->last_with_datap == NULL) { + chain = buf->last; + } else { + chain = *buf->last_with_datap; + } /* If there are no chains allocated for this buffer, allocate one * big enough to hold all the data. */