summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-11-14 15:43:49 -0500
committerNick Mathewson <nickm@torproject.org>2018-11-14 15:43:49 -0500
commit962db831c1e9c4050451bed2382e89ac9e4e6233 (patch)
tree962ae5300dc5c7022a7283a019109fe5218d0a1d
parentd098dda776e165647a39ebd7d8dc9982086d8059 (diff)
parentd598d834f5ce3ae3decb53336c95c8f5d361587a (diff)
downloadtor-962db831c1e9c4050451bed2382e89ac9e4e6233.tar.gz
tor-962db831c1e9c4050451bed2382e89ac9e4e6233.zip
Merge branch 'maint-0.3.5' into release-0.3.5
-rw-r--r--changes/bug277506
-rw-r--r--src/core/mainloop/mainloop.c17
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;
}