aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2022-10-19 15:27:22 -0400
committerDavid Goulet <dgoulet@torproject.org>2022-10-19 16:39:10 -0400
commit04cccd70744a09492b70baf974b2953d6e5c6d0a (patch)
tree64e61e303c847d50db6bb4e83ac5da7a08e03d02 /src
parent921268d4ce3e55c87e1df91a17b96d8d1407fbb7 (diff)
downloadtor-04cccd70744a09492b70baf974b2953d6e5c6d0a.tar.gz
tor-04cccd70744a09492b70baf974b2953d6e5c6d0a.zip
hs: Retry service rendezvous on circuit close
Move the retry from circuit_expire_building() to when the offending circuit is being closed. Fixes #40695 Signed-off-by: David Goulet <dgoulet@torproject.org>
Diffstat (limited to 'src')
-rw-r--r--src/core/or/circuituse.c1
-rw-r--r--src/core/or/origin_circuit_st.h8
-rw-r--r--src/feature/hs/hs_circuit.c16
-rw-r--r--src/feature/hs/hs_circuit.h2
-rw-r--r--src/feature/hs/hs_service.c3
5 files changed, 5 insertions, 25 deletions
diff --git a/src/core/or/circuituse.c b/src/core/or/circuituse.c
index acb9a7fba1..dbeea10821 100644
--- a/src/core/or/circuituse.c
+++ b/src/core/or/circuituse.c
@@ -759,7 +759,6 @@ circuit_expire_building(void)
(unsigned)victim->n_circ_id,
victim->state, circuit_state_to_string(victim->state),
victim->purpose);
- hs_circ_retry_service_rendezvous_point(TO_ORIGIN_CIRCUIT(victim));
/* We'll close as a timeout the victim circuit. The rendezvous point
* won't keep both circuits, it only keeps the newest (for the same
* cookie). */
diff --git a/src/core/or/origin_circuit_st.h b/src/core/or/origin_circuit_st.h
index 2cd8a33abc..73b971f72d 100644
--- a/src/core/or/origin_circuit_st.h
+++ b/src/core/or/origin_circuit_st.h
@@ -209,14 +209,6 @@ struct origin_circuit_t {
* no circuits have opened. Used to prevent spamming logs. */
unsigned int relaxed_timeout : 1;
- /** Set iff this is a service-side rendezvous circuit for which a
- * new connection attempt has been launched. We consider launching
- * a new service-side rend circ to a client when the previous one
- * fails; now that we don't necessarily close a service-side rend
- * circ when we launch a new one to the same client, this flag keeps
- * us from launching two retries for the same failed rend circ. */
- unsigned int hs_service_side_rend_circ_has_been_relaunched : 1;
-
/** What commands were sent over this circuit that decremented the
* RELAY_EARLY counter? This is for debugging task 878. */
uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT];
diff --git a/src/feature/hs/hs_circuit.c b/src/feature/hs/hs_circuit.c
index 307557dc86..fa8f9e05cf 100644
--- a/src/feature/hs/hs_circuit.c
+++ b/src/feature/hs/hs_circuit.c
@@ -433,16 +433,6 @@ can_relaunch_service_rendezvous_point(const origin_circuit_t *circ)
/* XXX: Retrying under certain condition. This is related to #22455. */
- /* Avoid to relaunch twice a circuit to the same rendezvous point at the
- * same time. */
- if (circ->hs_service_side_rend_circ_has_been_relaunched) {
- log_info(LD_REND, "Rendezvous circuit to %s has already been retried. "
- "Skipping retry.",
- safe_str_client(
- extend_info_describe(circ->build_state->chosen_exit)));
- goto disallow;
- }
-
/* We check failure_count >= hs_get_service_max_rend_failures()-1 below, and
* the -1 is because we increment the failure count for our current failure
* *after* this clause. */
@@ -684,7 +674,7 @@ hs_circ_service_get_established_intro_circ(const hs_service_intro_point_t *ip)
* - We've already retried this specific rendezvous circuit.
*/
void
-hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ)
+hs_circ_retry_service_rendezvous_point(const origin_circuit_t *circ)
{
tor_assert(circ);
tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
@@ -694,10 +684,6 @@ hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ)
goto done;
}
- /* Flag the circuit that we are relaunching, to avoid to relaunch twice a
- * circuit to the same rendezvous point at the same time. */
- circ->hs_service_side_rend_circ_has_been_relaunched = 1;
-
/* Legacy services don't have a hidden service ident. */
if (circ->hs_ident) {
retry_service_rendezvous_point(circ);
diff --git a/src/feature/hs/hs_circuit.h b/src/feature/hs/hs_circuit.h
index 808e648951..afbff7b894 100644
--- a/src/feature/hs/hs_circuit.h
+++ b/src/feature/hs/hs_circuit.h
@@ -33,7 +33,7 @@ int hs_circ_launch_intro_point(hs_service_t *service,
int hs_circ_launch_rendezvous_point(const hs_service_t *service,
const curve25519_public_key_t *onion_key,
const uint8_t *rendezvous_cookie);
-void hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ);
+void hs_circ_retry_service_rendezvous_point(const origin_circuit_t *circ);
origin_circuit_t *hs_circ_service_get_intro_circ(
const hs_service_intro_point_t *ip);
diff --git a/src/feature/hs/hs_service.c b/src/feature/hs/hs_service.c
index 716386408a..4e971233af 100644
--- a/src/feature/hs/hs_service.c
+++ b/src/feature/hs/hs_service.c
@@ -3675,6 +3675,9 @@ hs_service_circuit_cleanup_on_close(const circuit_t *circ)
hs_metrics_close_established_rdv(
&CONST_TO_ORIGIN_CIRCUIT(circ)->hs_ident->identity_pk);
break;
+ case CIRCUIT_PURPOSE_S_CONNECT_REND:
+ hs_circ_retry_service_rendezvous_point(CONST_TO_ORIGIN_CIRCUIT(circ));
+ break;
default:
break;
}