From f88c8ca8c98dc3a0c9e63012ce425d1287625444 Mon Sep 17 00:00:00 2001 From: Robert Ransom Date: Sat, 24 Dec 2011 04:47:30 -0800 Subject: Don't close HS service-side rend circs on timeout --- src/or/rendservice.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/or/rendservice.c') diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 76caeffd0f..bbc9c91866 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -1419,6 +1419,17 @@ rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc) tor_assert(oldcirc->_base.purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); + /* Don't relaunch the same rend circ twice. */ + if (oldcirc->hs_service_side_rend_circ_has_been_relaunched) { + log_info(LD_REND, "Rendezvous circuit to %s has already been relaunched; " + "not relaunching it again.", + oldcirc->build_state ? + safe_str(extend_info_describe(oldcirc->build_state->chosen_exit)) + : "*unknown*"); + return; + } + oldcirc->hs_service_side_rend_circ_has_been_relaunched = 1; + if (!oldcirc->build_state || oldcirc->build_state->failure_count > MAX_REND_FAILURES || oldcirc->build_state->expiry_time < time(NULL)) { @@ -1727,6 +1738,11 @@ rend_service_rendezvous_has_opened(origin_circuit_t *circuit) "cookie %s for service %s", circuit->_base.n_circ_id, hexcookie, serviceid); + /* Clear the 'in-progress HS circ has timed out' flag for + * consistency with what happens on the client side; this line has + * no effect on Tor's behaviour. */ + circuit->hs_circ_has_timed_out = 0; + service = rend_service_get_by_pk_digest( circuit->rend_data->rend_pk_digest); if (!service) { -- cgit v1.2.3-54-g00ecf