]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
core/mainloop: Limit growth of conn->inbuf
authorcypherpunks <cypherpunks@torproject.org>
Tue, 3 Mar 2020 07:01:05 +0000 (07:01 +0000)
committercypherpunks <cypherpunks@torproject.org>
Tue, 24 Mar 2020 05:19:24 +0000 (05:19 +0000)
If the buf_t's length could potentially become greater than INT_MAX - 1,
it sets off an IF_BUG_ONCE in buf_read_from_tls().

All of the rest of the buffers.c code has similar BUG/asserts for this
invariant.

changes/bug33131 [new file with mode: 0644]
src/core/mainloop/connection.c

diff --git a/changes/bug33131 b/changes/bug33131
new file mode 100644 (file)
index 0000000..bc5ef7b
--- /dev/null
@@ -0,0 +1,3 @@
+  o Minor bugfixes (mainloop):
+    - Better guard against growing a buffer past its maximum 2GB in size.
+      Fixes bug 33131; bugfix on 0.3.0.4-rc.
index 3595bba85c2564cc616f214293b8da05922a3b92..3c8527dd53c1ea4126276a6b155d4059e8c09412 100644 (file)
@@ -3684,6 +3684,15 @@ connection_buf_read_from_socket(connection_t *conn, ssize_t *max_to_read,
     at_most = connection_bucket_read_limit(conn, approx_time());
   }
 
+  /* Do not allow inbuf to grow past INT_MAX - 1. */
+  const ssize_t maximum = INT_MAX - 1 - buf_datalen(conn->inbuf);
+  if (at_most > maximum) {
+    log_debug(LD_NET, "%d: inbuf_datalen=%"TOR_PRIuSZ", adding %"
+              TOR_PRIdSZ" might overflow.",
+              (int)conn->s, buf_datalen(conn->inbuf), at_most);
+    at_most = maximum;
+  }
+
   slack_in_buf = buf_slack(conn->inbuf);
  again:
   if ((size_t)at_most > slack_in_buf && slack_in_buf >= 1024) {