Browse Source

Use evbuffer_pullup properly in fetch_from_evbuffer_socks_client.

evbuffer_pullup does nothing and returns NULL if the caller asks it to
linearize more data than the buffer contains.

Introduced in 9796b9bfa6a757780d6185547e4baf739c53cdac.

Reported by piebeer; fixed with help from doors.
Robert Ransom 13 years ago
parent
commit
524fdeeb1e
1 changed files with 7 additions and 3 deletions
  1. 7 3
      src/or/buffers.c

+ 7 - 3
src/or/buffers.c

@@ -1954,9 +1954,13 @@ fetch_from_evbuffer_socks_client(struct evbuffer *buf, int state,
   size_t datalen;
   int r;
 
-  data = evbuffer_pullup(buf, 128); /* Make sure we have at least 128
-                                     * contiguous bytes if possible. */
-  datalen = evbuffer_get_contiguous_space(buf);
+  /* Linearize the SOCKS response in the buffer, up to 128 bytes.
+   * (parse_socks_client shouldn't need to see anything beyond that.) */
+  datalen = evbuffer_get_length(buf);
+  if (datalen > 128)
+    datalen = 128;
+  data = evbuffer_pullup(buf, datalen);
+
   r = parse_socks_client(data, datalen, state, reason, &drain);
   if (drain > 0)
     evbuffer_drain(buf, drain);