aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2019-03-09 02:55:28 -0500
committerGeorge Kadianakis <desnacked@riseup.net>2019-03-14 12:53:33 +0200
commitadd0f89c14b4aab6726e11acdcd864ee0c91543b (patch)
tree6c384adad4b5724332fc7c5a6f832f0fd77ff9ae
parent2e74edb53ef9ac417d8424a0785af839f83791ca (diff)
downloadtor-add0f89c14b4aab6726e11acdcd864ee0c91543b.tar.gz
tor-add0f89c14b4aab6726e11acdcd864ee0c91543b.zip
relays shouldn't close idle rend circuits
Allow connections to single onion services to remain idle without being disconnected. Relays acting as rendezvous points for single onion services were mistakenly closing idle established rendezvous circuits after 60 seconds, thinking that they are unused directory-fetching circuits that had served their purpose. Fixes bug 29665; bugfix on 0.2.1.26.
-rw-r--r--changes/bug296657
-rw-r--r--src/or/circuituse.c5
2 files changed, 11 insertions, 1 deletions
diff --git a/changes/bug29665 b/changes/bug29665
new file mode 100644
index 0000000000..d89046faf5
--- /dev/null
+++ b/changes/bug29665
@@ -0,0 +1,7 @@
+ o Minor bugfixes (single onion services):
+ - Allow connections to single onion services to remain idle without
+ being disconnected. Relays acting as rendezvous points for
+ single onion services were mistakenly closing idle established
+ rendezvous circuits after 60 seconds, thinking that they are unused
+ directory-fetching circuits that had served their purpose. Fixes
+ bug 29665; bugfix on 0.2.1.26.
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 96cd3cd7e8..7c0b60293d 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -1381,10 +1381,13 @@ circuit_expire_old_circuits_serverside(time_t now)
or_circ = TO_OR_CIRCUIT(circ);
/* If the circuit has been idle for too long, and there are no streams
* on it, and it ends here, and it used a create_fast, mark it for close.
+ *
+ * Also if there is a rend_splice on it, it's a single onion service
+ * circuit and we should not close it.
*/
if (or_circ->is_first_hop && !circ->n_chan &&
!or_circ->n_streams && !or_circ->resolving_streams &&
- or_circ->p_chan &&
+ or_circ->p_chan && !or_circ->rend_splice &&
channel_when_last_xmit(or_circ->p_chan) <= cutoff) {
log_info(LD_CIRC, "Closing circ_id %u (empty %d secs ago)",
(unsigned)or_circ->p_circ_id,