aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-12-29 02:33:42 +0000
committerNick Mathewson <nickm@torproject.org>2007-12-29 02:33:42 +0000
commitbd32982c779261e0aae59499c0299c23c1d3f05b (patch)
tree097493ee32531eb99bca97483cc0bdfb7a0cf8fb /src
parentc03ef9c395cc6c3aab504a8f54db459015ca8a34 (diff)
downloadtor-bd32982c779261e0aae59499c0299c23c1d3f05b.tar
tor-bd32982c779261e0aae59499c0299c23c1d3f05b.tar.gz
r17426@catbus: nickm | 2007-12-28 21:12:29 -0500
Remove need for buf_pullup in fetch_line_from_buf(). svn:r13002
Diffstat (limited to 'src')
-rw-r--r--src/or/buffers.c31
-rw-r--r--src/or/control.c9
2 files changed, 27 insertions, 13 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c
index 8f1bba241..6a74f0d57 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -1398,6 +1398,22 @@ peek_buf_has_control0_command(buf_t *buf)
return 0;
}
+/** DOCDOC */
+static int
+buf_find_offset_of_char(buf_t *buf, char ch)
+{
+ chunk_t *chunk;
+ int offset = 0;
+ for (chunk = buf->head; chunk; chunk = chunk->next) {
+ char *cp = memchr(chunk->data, ch, chunk->datalen);
+ if (cp)
+ return offset + (cp - chunk->data);
+ else
+ offset += chunk->datalen;
+ }
+ return -1;
+}
+
/** Try to read a single LF-terminated line from <b>buf</b>, and write it,
* NUL-terminated, into the *<b>data_len</b> byte buffer at <b>data_out</b>.
* Set *<b>data_len</b> to the number of bytes in the line, not counting the
@@ -1408,21 +1424,18 @@ peek_buf_has_control0_command(buf_t *buf)
int
fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len)
{
- char *cp;
size_t sz;
+ int offset;
if (!buf->head)
return 0;
- /* XXXX020 pull up less aggressively. And implement setting *data_len
- * properly in cases where we return -1. */
- buf_pullup(buf, *data_len, 0);
- cp = memchr(buf->head->data, '\n', buf->head->datalen);
- if (!cp) {
+
+ offset = buf_find_offset_of_char(buf, '\n');
+ if (offset < 0)
return 0;
- }
- sz = cp - buf->head->data;
+ sz = (size_t) offset;
if (sz+2 > *data_len) {
- *data_len = sz+2;
+ *data_len = sz + 2;
return -1;
}
fetch_from_buf(data_out, sz+1, buf);
diff --git a/src/or/control.c b/src/or/control.c
index c91890cf6..39deb8d26 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -2631,10 +2631,11 @@ connection_control_process_inbuf(control_connection_t *conn)
/* Line not all here yet. Wait. */
return 0;
else if (r == -1) {
- while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
- conn->incoming_cmd_len *= 2;
- conn->incoming_cmd = tor_realloc(conn->incoming_cmd,
- conn->incoming_cmd_len);
+ /*XXXX020 impose some maximum on length! */
+ while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
+ conn->incoming_cmd_len *= 2;
+ conn->incoming_cmd = tor_realloc(conn->incoming_cmd,
+ conn->incoming_cmd_len);
}
} while (r != 1);