aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-11-04 22:30:49 +0000
committerNick Mathewson <nickm@torproject.org>2004-11-04 22:30:49 +0000
commitd9e0f3f9bcdf0e73873de3982a28961ddcfc7c3e (patch)
tree60ecd5dfdb2a5208ac904724271864e9d75a5e01
parent9a06612ff62a501a0c41d3962ddda0cf2660853d (diff)
downloadtor-d9e0f3f9bcdf0e73873de3982a28961ddcfc7c3e.tar
tor-d9e0f3f9bcdf0e73873de3982a28961ddcfc7c3e.tar.gz
Make sure control command bodies are always followed by a NUL
svn:r2678
-rw-r--r--src/or/buffers.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 35f1ed567..4b6edd044 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -636,7 +636,16 @@ int fetch_from_buf_socks(buf_t *buf, socks_request_t *req) {
}
}
-/* DOCDOC: 1 if complete, 0 if pending, -1 on error. */
+/** If there is a complete control message waiting on buf, then store
+ * its contents into *<b>type_out</b>, store its body's length into
+ * *<b>len_out</b>, allocate and store a string for its body into
+ * *<b>body_out</b>, and return -1. (body_out will always be NUL-terminated,
+ * even if the control message body doesn't end with NUL.)
+ *
+ * If there is not a complete control message waiting, return 0.
+ *
+ * Return -1 on error.
+ */
int fetch_from_buf_control(buf_t *buf, uint16_t *len_out, uint16_t *type_out,
char **body_out)
{
@@ -657,8 +666,9 @@ int fetch_from_buf_control(buf_t *buf, uint16_t *len_out, uint16_t *type_out,
*len_out = len;
*type_out = ntohs(get_uint16(buf->mem+2));
if (len) {
- *body_out = tor_malloc(len);
+ *body_out = tor_malloc(len+1);
memcpy(*body_out, buf->mem+4, len);
+ body_out[len] = '\0';
} else {
*body_out = NULL;
}