diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-11-30 11:09:50 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-11-30 11:09:50 -0500 |
commit | a5d43cf4c6a6d4c1fbb7ed244eac9124317d273d (patch) | |
tree | c8efef9c34786ef5e046cfc2f58b12b7400f9e9a | |
parent | 4f360f89ca1e089732853463fd0bc07d95142704 (diff) | |
parent | 154006ad36aa8ec2ebb50a366348b3b35c2c06b4 (diff) | |
download | libevent-a5d43cf4c6a6d4c1fbb7ed244eac9124317d273d.tar.gz |
Merge branch 'evbufer_peek_fix_v3'
-rw-r--r-- | buffer.c | 5 | ||||
-rw-r--r-- | test/regress_buffer.c | 37 |
2 files changed, 41 insertions, 1 deletions
@@ -2742,7 +2742,10 @@ evbuffer_peek(struct evbuffer *buffer, ev_ssize_t len, 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; + len = buffer->total_len; + if (start_at) { + len -= start_at->pos; + } } while (chain) { diff --git a/test/regress_buffer.c b/test/regress_buffer.c index aa1cd2a7..4d6a5de2 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -1844,6 +1844,42 @@ end: } static void +test_evbuffer_peek_first_gt(void *info) +{ + struct evbuffer *buf = NULL, *tmp_buf = NULL; + struct evbuffer_ptr ptr; + struct evbuffer_iovec v[2]; + + buf = evbuffer_new(); + tmp_buf = evbuffer_new(); + evbuffer_add_printf(tmp_buf, "Contents of chunk 100\n"); + evbuffer_add_buffer(buf, tmp_buf); + evbuffer_add_printf(tmp_buf, "Contents of chunk 1\n"); + evbuffer_add_buffer(buf, tmp_buf); + + evbuffer_ptr_set(buf, &ptr, 0, EVBUFFER_PTR_SET); + + /** The only case that matters*/ + tt_int_op(evbuffer_peek(buf, -1, &ptr, NULL, 0), ==, 2); + /** Just in case */ + tt_int_op(evbuffer_peek(buf, -1, &ptr, v, 2), ==, 2); + + evbuffer_ptr_set(buf, &ptr, 20, EVBUFFER_PTR_ADD); + tt_int_op(evbuffer_peek(buf, -1, &ptr, NULL, 0), ==, 2); + tt_int_op(evbuffer_peek(buf, -1, &ptr, v, 2), ==, 2); + tt_int_op(evbuffer_peek(buf, 2, &ptr, NULL, 0), ==, 1); + tt_int_op(evbuffer_peek(buf, 2, &ptr, v, 2), ==, 1); + tt_int_op(evbuffer_peek(buf, 3, &ptr, NULL, 0), ==, 2); + tt_int_op(evbuffer_peek(buf, 3, &ptr, v, 2), ==, 2); + +end: + if (buf) + evbuffer_free(buf); + if (tmp_buf) + evbuffer_free(tmp_buf); +} + +static void test_evbuffer_peek(void *info) { struct evbuffer *buf = NULL, *tmp_buf = NULL; @@ -2210,6 +2246,7 @@ struct testcase_t evbuffer_testcases[] = { { "multicast_drain", test_evbuffer_multicast_drain, 0, NULL, NULL }, { "prepend", test_evbuffer_prepend, TT_FORK, NULL, NULL }, { "peek", test_evbuffer_peek, 0, NULL, NULL }, + { "peek_first_gt", test_evbuffer_peek_first_gt, 0, NULL, NULL }, { "freeze_start", test_evbuffer_freeze, 0, &nil_setup, (void*)"start" }, { "freeze_end", test_evbuffer_freeze, 0, &nil_setup, (void*)"end" }, { "add_iovec", test_evbuffer_add_iovec, 0, NULL, NULL}, |