summaryrefslogtreecommitdiff
path: root/src/or/hs_circuit.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-12-11 09:42:12 -0500
committerNick Mathewson <nickm@torproject.org>2017-12-11 09:42:12 -0500
commitd68abbe358af41b18c9c54444e49689e2626328d (patch)
treed797b09285c0946218f9a8db4d59165c7dec9205 /src/or/hs_circuit.c
parent4b41ffa64d251268602b06552a53da8cbd60af5c (diff)
parent68601a85ca48bf2cd54087fe21fdcf8aaa23ebb2 (diff)
downloadtor-d68abbe358af41b18c9c54444e49689e2626328d.tar.gz
tor-d68abbe358af41b18c9c54444e49689e2626328d.zip
Merge remote-tracking branch 'dgoulet/bug23603_032_02' into maint-0.3.2
Diffstat (limited to 'src/or/hs_circuit.c')
-rw-r--r--src/or/hs_circuit.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/or/hs_circuit.c b/src/or/hs_circuit.c
index ee952f4d68..a58166ccde 100644
--- a/src/or/hs_circuit.c
+++ b/src/or/hs_circuit.c
@@ -1178,3 +1178,31 @@ hs_circ_send_establish_rendezvous(origin_circuit_t *circ)
return -1;
}
+/* We are about to close or free this <b>circ</b>. Clean it up from any
+ * related HS data structures. This function can be called multiple times
+ * safely for the same circuit. */
+void
+hs_circ_cleanup(circuit_t *circ)
+{
+ tor_assert(circ);
+
+ /* If it's a service-side intro circ, notify the HS subsystem for the intro
+ * point circuit closing so it can be dealt with cleanly. */
+ if (circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
+ circ->purpose == CIRCUIT_PURPOSE_S_INTRO) {
+ hs_service_intro_circ_has_closed(TO_ORIGIN_CIRCUIT(circ));
+ }
+
+ /* Clear HS circuitmap token for this circ (if any). Very important to be
+ * done after the HS subsystem has been notified of the close else the
+ * circuit will not be found.
+ *
+ * We do this at the close if possible because from that point on, the
+ * circuit is good as dead. We can't rely on removing it in the circuit
+ * free() function because we open a race window between the close and free
+ * where we can't register a new circuit for the same intro point. */
+ if (circ->hs_token) {
+ hs_circuitmap_remove_circuit(circ);
+ }
+}
+