From aca15838618c08ee7a706871649a79540a0f6f03 Mon Sep 17 00:00:00 2001
From: Nick Mathewson <nickm@torproject.org>
Date: Mon, 6 Jun 2011 21:03:35 -0400
Subject: [PATCH 2/2] Allow evbuffer_ptr_set to yield a point just after the end of the buffer.

---
 buffer.c              |    7 ++++++-
 test/regress_buffer.c |    2 ++
 2 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/buffer.c b/buffer.c
index ee600ca..976e48a 100644
--- a/buffer.c
+++ b/buffer.c
@@ -2350,6 +2350,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);
 
@@ -2376,14 +2377,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 317bc95..3f0c3fe 100644
--- a/test/regress_buffer.c
+++ b/test/regress_buffer.c
@@ -1066,6 +1066,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);
 
-- 
1.7.4.2

