summaryrefslogtreecommitdiff
path: root/src/feature
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-11-16 08:57:56 -0500
committerNick Mathewson <nickm@torproject.org>2018-11-16 08:57:56 -0500
commit35558c39dd162902a0e007b6e9dbd66d979043fd (patch)
tree01831f58159f0a12c712d778fcc25435a8028f6e /src/feature
parentc9906cc3f6b7ba529173612ad87a8a9ce2dd6cf8 (diff)
parent8b2e72106ae87c8018d9bae25f826c7bd92a88e8 (diff)
downloadtor-35558c39dd162902a0e007b6e9dbd66d979043fd.tar.gz
tor-35558c39dd162902a0e007b6e9dbd66d979043fd.zip
Merge remote-tracking branch 'dgoulet/ticket27471_035_02' into maint-0.3.5
Diffstat (limited to 'src/feature')
-rw-r--r--src/feature/hs/hs_cache.c7
-rw-r--r--src/feature/hs/hs_client.c32
-rw-r--r--src/feature/hs/hs_client.h1
-rw-r--r--src/feature/rend/rendservice.c2
4 files changed, 41 insertions, 1 deletions
diff --git a/src/feature/hs/hs_cache.c b/src/feature/hs/hs_cache.c
index b9bcb446a1..afd69e1bec 100644
--- a/src/feature/hs/hs_cache.c
+++ b/src/feature/hs/hs_cache.c
@@ -647,6 +647,13 @@ cache_store_as_client(hs_cache_client_descriptor_t *client_desc)
}
/* Remove old entry. Make space for the new one! */
remove_v3_desc_as_client(cache_entry);
+
+ /* We just removed an old descriptor and will replace it. We'll close all
+ * intro circuits related to this old one so we don't have leftovers. We
+ * leave the rendezvous circuits opened because they could be in use. */
+ hs_client_close_intro_circuits_from_desc(cache_entry->desc);
+
+ /* Free it. */
cache_client_desc_free(cache_entry);
}
diff --git a/src/feature/hs/hs_client.c b/src/feature/hs/hs_client.c
index 11e24a3660..dfad216abb 100644
--- a/src/feature/hs/hs_client.c
+++ b/src/feature/hs/hs_client.c
@@ -1844,6 +1844,38 @@ hs_client_reextend_intro_circuit(origin_circuit_t *circ)
return ret;
}
+/* Close all client introduction circuits related to the given descriptor.
+ * This is called with a descriptor that is about to get replaced in the
+ * client cache.
+ *
+ * Even though the introduction point might be exactly the same, we'll rebuild
+ * them if needed but the odds are very low that an existing matching
+ * introduction circuit exists at that stage. */
+void
+hs_client_close_intro_circuits_from_desc(const hs_descriptor_t *desc)
+{
+ origin_circuit_t *ocirc = NULL;
+
+ tor_assert(desc);
+
+ /* We iterate over all client intro circuits because they aren't kept in the
+ * HS circuitmap. That is probably something we want to do one day. */
+ while ((ocirc = circuit_get_next_intro_circ(ocirc, true))) {
+ if (ocirc->hs_ident == NULL) {
+ /* Not a v3 circuit, ignore it. */
+ continue;
+ }
+
+ /* Does it match any IP in the given descriptor? If not, ignore. */
+ if (find_desc_intro_point_by_ident(ocirc->hs_ident, desc) == NULL) {
+ continue;
+ }
+
+ /* We have a match. Close the circuit as consider it expired. */
+ circuit_mark_for_close(TO_CIRCUIT(ocirc), END_CIRC_REASON_FINISHED);
+ }
+}
+
/* Release all the storage held by the client subsystem. */
void
hs_client_free_all(void)
diff --git a/src/feature/hs/hs_client.h b/src/feature/hs/hs_client.h
index fb4f9e9e9f..f6fb167ea2 100644
--- a/src/feature/hs/hs_client.h
+++ b/src/feature/hs/hs_client.h
@@ -77,6 +77,7 @@ int hs_config_client_authorization(const or_options_t *options,
int validate_only);
int hs_client_reextend_intro_circuit(origin_circuit_t *circ);
+void hs_client_close_intro_circuits_from_desc(const hs_descriptor_t *desc);
void hs_client_purge_state(void);
diff --git a/src/feature/rend/rendservice.c b/src/feature/rend/rendservice.c
index bae9da3fe5..d135581061 100644
--- a/src/feature/rend/rendservice.c
+++ b/src/feature/rend/rendservice.c
@@ -631,7 +631,7 @@ rend_service_prune_list_impl_(void)
/* For every service introduction circuit we can find, see if we have a
* matching surviving configured service. If not, close the circuit. */
- while ((ocirc = circuit_get_next_service_intro_circ(ocirc))) {
+ while ((ocirc = circuit_get_next_intro_circ(ocirc, false))) {
int keep_it = 0;
if (ocirc->rend_data == NULL) {
/* This is a v3 circuit, ignore it. */