diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-11-14 15:43:49 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-11-14 15:43:49 -0500 |
commit | 962db831c1e9c4050451bed2382e89ac9e4e6233 (patch) | |
tree | 962ae5300dc5c7022a7283a019109fe5218d0a1d | |
parent | d098dda776e165647a39ebd7d8dc9982086d8059 (diff) | |
parent | d598d834f5ce3ae3decb53336c95c8f5d361587a (diff) | |
download | tor-962db831c1e9c4050451bed2382e89ac9e4e6233.tar.gz tor-962db831c1e9c4050451bed2382e89ac9e4e6233.zip |
Merge branch 'maint-0.3.5' into release-0.3.5
-rw-r--r-- | changes/bug27750 | 6 | ||||
-rw-r--r-- | src/core/mainloop/mainloop.c | 17 |
2 files changed, 12 insertions, 11 deletions
diff --git a/changes/bug27750 b/changes/bug27750 new file mode 100644 index 0000000000..c234788b1c --- /dev/null +++ b/changes/bug27750 @@ -0,0 +1,6 @@ + o Minor bugfixes (connection, relay): + - Avoid a wrong BUG() stacktrace in case a closing connection is being held + open because the write side is rate limited but not the read side. Now, + the connection read side is simply shutdown instead of kept open until tor + is able to flush the connection and then fully close it. Fixes bug 27750; + bugfix on 0.3.4.1-alpha. diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c index a9f1429787..7eff82fee4 100644 --- a/src/core/mainloop/mainloop.c +++ b/src/core/mainloop/mainloop.c @@ -1011,23 +1011,18 @@ conn_close_if_marked(int i) * busy Libevent loops where we keep ending up here and returning * 0 until we are no longer blocked on bandwidth. */ - connection_consider_empty_read_buckets(conn); connection_consider_empty_write_buckets(conn); - /* Make sure that consider_empty_buckets really disabled the * connection: */ if (BUG(connection_is_writing(conn))) { connection_write_bw_exhausted(conn, true); } - if (BUG(connection_is_reading(conn))) { - /* XXXX+ We should make this code unreachable; if a connection is - * marked for close and flushing, there is no point in reading to it - * at all. Further, checking at this point is a bit of a hack: it - * would make much more sense to react in - * connection_handle_read_impl, or to just stop reading in - * mark_and_flush */ - connection_read_bw_exhausted(conn, true/* kludge. */); - } + + /* The connection is being held due to write rate limit and thus will + * flush its data later. We need to stop reading because this + * connection is about to be closed once flushed. It should not + * process anything more coming in at this stage. */ + connection_stop_reading(conn); } return 0; } |