Commit bd32982c authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

r17426@catbus: nickm | 2007-12-28 21:12:29 -0500

 Remove need for buf_pullup in fetch_line_from_buf().


svn:r13002
parent c03ef9c3
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -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,19 +1424,16 @@ 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;
    return -1;
+5 −4
Original line number Diff line number Diff line
@@ -2631,6 +2631,7 @@ connection_control_process_inbuf(control_connection_t *conn)
        /* Line not all here yet. Wait. */
        return 0;
      else if (r == -1) {
        /*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,