mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-24 14:51:11 +01:00
r17426@catbus: nickm | 2007-12-28 21:12:29 -0500
Remove need for buf_pullup in fetch_line_from_buf(). svn:r13002
This commit is contained in:
parent
c03ef9c395
commit
bd32982c77
2 changed files with 27 additions and 13 deletions
|
@ -1398,6 +1398,22 @@ peek_buf_has_control0_command(buf_t *buf)
|
||||||
return 0;
|
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,
|
/** 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>.
|
* 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
|
* 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
|
int
|
||||||
fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len)
|
fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len)
|
||||||
{
|
{
|
||||||
char *cp;
|
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
int offset;
|
||||||
|
|
||||||
if (!buf->head)
|
if (!buf->head)
|
||||||
return 0;
|
return 0;
|
||||||
/* XXXX020 pull up less aggressively. And implement setting *data_len
|
|
||||||
* properly in cases where we return -1. */
|
offset = buf_find_offset_of_char(buf, '\n');
|
||||||
buf_pullup(buf, *data_len, 0);
|
if (offset < 0)
|
||||||
cp = memchr(buf->head->data, '\n', buf->head->datalen);
|
|
||||||
if (!cp) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
sz = (size_t) offset;
|
||||||
sz = cp - buf->head->data;
|
|
||||||
if (sz+2 > *data_len) {
|
if (sz+2 > *data_len) {
|
||||||
*data_len = sz+2;
|
*data_len = sz + 2;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fetch_from_buf(data_out, sz+1, buf);
|
fetch_from_buf(data_out, sz+1, buf);
|
||||||
|
|
|
@ -2631,10 +2631,11 @@ connection_control_process_inbuf(control_connection_t *conn)
|
||||||
/* Line not all here yet. Wait. */
|
/* Line not all here yet. Wait. */
|
||||||
return 0;
|
return 0;
|
||||||
else if (r == -1) {
|
else if (r == -1) {
|
||||||
while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
|
/*XXXX020 impose some maximum on length! */
|
||||||
conn->incoming_cmd_len *= 2;
|
while (conn->incoming_cmd_len < data_len+conn->incoming_cmd_cur_len)
|
||||||
conn->incoming_cmd = tor_realloc(conn->incoming_cmd,
|
conn->incoming_cmd_len *= 2;
|
||||||
conn->incoming_cmd_len);
|
conn->incoming_cmd = tor_realloc(conn->incoming_cmd,
|
||||||
|
conn->incoming_cmd_len);
|
||||||
}
|
}
|
||||||
} while (r != 1);
|
} while (r != 1);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue