diff --git a/buffer.c b/buffer.c index 0c751bd8..1036f8ff 100644 --- a/buffer.c +++ b/buffer.c @@ -2734,14 +2734,21 @@ evbuffer_peek(struct evbuffer *buffer, ev_ssize_t len, chain = buffer->first; } + if (n_vec == 0 && len < 0) { + /* If no vectors are provided and they asked for "everything", + * pretend they asked for the actual available amount. */ + len = buffer->total_len - len_so_far; + } + while (chain) { if (len >= 0 && len_so_far >= len) break; if (idxbuffer + chain->misalign; vec[idx].iov_len = chain->off; - } else if (len<0) + } else if (len<0) { break; + } ++idx; len_so_far += chain->off; chain = chain->next; diff --git a/include/event2/buffer.h b/include/event2/buffer.h index f99e9a5b..895982e5 100644 --- a/include/event2/buffer.h +++ b/include/event2/buffer.h @@ -779,8 +779,10 @@ struct evbuffer_ptr evbuffer_search_eol(struct evbuffer *buffer, the buffer does not have as much data as you asked to see). @param buffer the evbuffer to peek into, - @param len the number of bytes to try to peek. If negative, we - will try to fill as much of vec_out as we can. + @param len the number of bytes to try to peek. If len is negative, we + will try to fill as much of vec_out as we can. If len is negative + and vec_out is not provided, we return the number of evbuffer_iovecs + that would be needed to get all the data in the buffer. @param start_at an evbuffer_ptr indicating the point at which we should start looking for data. NULL means, "At the start of the buffer." diff --git a/test/regress_buffer.c b/test/regress_buffer.c index 72e4dc54..ba9a1854 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -1780,6 +1780,10 @@ test_evbuffer_peek(void *info) evbuffer_add_buffer(buf, tmp_buf); } + /* How many chunks do we need for everything? */ + i = evbuffer_peek(buf, -1, NULL, NULL, 0); + tt_int_op(i, ==, 16); + /* Simple peek: get everything. */ i = evbuffer_peek(buf, -1, NULL, v, 20); tt_int_op(i, ==, 16); /* we used only 16 chunks. */