From: Nick Mathewson Date: Tue, 7 Jun 2011 01:03:35 +0000 (-0400) Subject: Allow evbuffer_ptr_set to yield a point just after the end of the buffer. X-Git-Tag: release-2.1.1-alpha~237^2~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e6fe1da9ad770ac903bcee3343514041df292c5b;p=libevent Allow evbuffer_ptr_set to yield a point just after the end of the buffer. --- diff --git a/buffer.c b/buffer.c index 84d3aea8..c4297ed0 100644 --- a/buffer.c +++ b/buffer.c @@ -2307,6 +2307,7 @@ evbuffer_ptr_set(struct evbuffer *buf, struct evbuffer_ptr *pos, { size_t left = position; struct evbuffer_chain *chain = NULL; + int result = 0; EVBUFFER_LOCK(buf); @@ -2333,14 +2334,18 @@ evbuffer_ptr_set(struct evbuffer *buf, struct evbuffer_ptr *pos, if (chain) { pos->_internal.chain = chain; pos->_internal.pos_in_chain = position + left; + } else if (left == 0 && buf->last) { + pos->_internal.chain = buf->last; + pos->_internal.pos_in_chain = buf->last->off; } else { pos->_internal.chain = NULL; pos->pos = -1; + result = -1; } EVBUFFER_UNLOCK(buf); - return chain != NULL ? 0 : -1; + return result; } /** diff --git a/test/regress_buffer.c b/test/regress_buffer.c index 2e5efeb1..a9a4f6a3 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -1222,6 +1222,8 @@ test_evbuffer_ptr_set(void *ptr) tt_assert(pos.pos == 10000); tt_assert(evbuffer_ptr_set(buf, &pos, 1000, EVBUFFER_PTR_ADD) == 0); tt_assert(pos.pos == 11000); + tt_assert(evbuffer_ptr_set(buf, &pos, 1000, EVBUFFER_PTR_ADD) == 0); + tt_assert(pos.pos == 12000); tt_assert(evbuffer_ptr_set(buf, &pos, 1000, EVBUFFER_PTR_ADD) == -1); tt_assert(pos.pos == -1);