mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 05:03:43 +01:00
core/mainloop: Limit growth of conn->inbuf
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.
This commit is contained in:
parent
b9c7c61ea5
commit
fd3e0c1542
3
changes/bug33131
Normal file
3
changes/bug33131
Normal file
@ -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.
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user