]> granicus.if.org Git - libevent/commitdiff
evbuffer_add: Use last_with_datap if set, not last.
authorMarcus Sundberg <marcus@marcussundberg.com>
Sat, 26 Mar 2016 19:11:43 +0000 (20:11 +0100)
committerMarcus Sundberg <marcus@marcussundberg.com>
Sat, 26 Mar 2016 19:52:07 +0000 (20:52 +0100)
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.

buffer.c

index 7cca0e8a7d6c5a0894e11798f4029bf500023423..f378b731217e35900415017427231fc60143e9f8 100644 (file)
--- 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. */