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.
--- /dev/null
+ 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.
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) {