[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] Use evbuffer_copyout() in inspect_evbuffer().
commit d2cd67c83fff5097d214c8c86169054a5558b902
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Wed Aug 17 13:07:43 2011 -0400
Use evbuffer_copyout() in inspect_evbuffer().
---
changes/require-le-2.0.13 | 5 +++++
src/or/buffers.c | 26 ++++++++------------------
2 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/changes/require-le-2.0.13 b/changes/require-le-2.0.13
index 0b9b2f9..56e7b31 100644
--- a/changes/require-le-2.0.13
+++ b/changes/require-le-2.0.13
@@ -5,3 +5,8 @@
Tor work badly with bufferevents. Requiring 2.0.13-stable also
means that Tor with bufferevents can take advantage of Libevent
APIs introduced after 2.0.8-rc.
+
+ o Minor bugfixes:
+ - Use evbuffer_copyout() in inspect_evbuffer(). This fixes a memory
+ leak, and lets Libevent worry about how to best copy data out
+ of a buffer.
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 488289c..c9c8e43 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -1054,13 +1054,13 @@ fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto)
#ifdef USE_BUFFEREVENTS
/** Try to read <b>n</b> bytes from <b>buf</b> at <b>pos</b> (which may be
* NULL for the start of the buffer), copying the data only if necessary. Set
- * *<b>data</b> to a pointer to the desired bytes. Set <b>free_out</b> to 1
+ * *<b>data_out</b> to a pointer to the desired bytes. Set <b>free_out</b> to 1
* if we needed to malloc *<b>data</b> because the original bytes were
* noncontiguous; 0 otherwise. Return the number of bytes actually available
- * at <b>data</b>.
+ * at *<b>data_out</b>.
*/
static ssize_t
-inspect_evbuffer(struct evbuffer *buf, char **data, size_t n, int *free_out,
+inspect_evbuffer(struct evbuffer *buf, char **data_out, size_t n, int *free_out,
struct evbuffer_ptr *pos)
{
int n_vecs, i;
@@ -1075,25 +1075,15 @@ inspect_evbuffer(struct evbuffer *buf, char **data, size_t n, int *free_out,
struct evbuffer_iovec v;
i = evbuffer_peek(buf, n, pos, &v, 1);
tor_assert(i == 1);
- *data = v.iov_base;
+ *data_out = v.iov_base;
*free_out = 0;
return v.iov_len;
} else {
- struct evbuffer_iovec *vecs =
- tor_malloc(sizeof(struct evbuffer_iovec)*n_vecs);
- size_t copied = 0;
- i = evbuffer_peek(buf, n, NULL, vecs, n_vecs);
- tor_assert(i == n_vecs);
- *data = tor_malloc(n);
- for (i=0; i < n_vecs; ++i) {
- size_t copy = n - copied;
- if (copy > vecs[i].iov_len)
- copy = vecs[i].iov_len;
- tor_assert(copied+copy <= n);
- memcpy(data+copied, vecs[i].iov_base, copy);
- copied += copy;
- }
+ ev_ssize_t copied;
+ *data_out = tor_malloc(n);
*free_out = 1;
+ copied = evbuffer_copyout(buf, *data_out, n);
+ tor_assert(copied >= 0 && (size_t)copied == n);
return copied;
}
}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits