hs: Implement a helper to repurpose a circuit

When we repurpose a hidden service circuit, we need to clean up from the HS
circuit map and any HS related data structured contained in the circuit.

This commit adds an helper function that does it when repurposing a hidden
service circuit.

Fixes #29034

Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
David Goulet
2019-05-28 09:44:06 -04:00
parent e5deb2bbc7
commit 3789f22bcb
6 changed files with 56 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
o Major bugfixes (Onion service reachability):
- Properly clean up the introduction point map and associated state when
circuits change purpose from onion service circuits to pathbias,
measurement, or other circuit types. This should fix some instances of
introduction point failure. Fixes bug 29034; bugfix on 0.3.2.1-alpha.
+6
View File
@@ -3052,6 +3052,12 @@ circuit_change_purpose(circuit_t *circ, uint8_t new_purpose)
if (circ->purpose == new_purpose) return;
/* Take specific actions if we are repurposing a hidden service circuit. */
if (circuit_purpose_is_hidden_service(circ->purpose) &&
!circuit_purpose_is_hidden_service(new_purpose)) {
hs_circ_repurpose(circ);
}
if (CIRCUIT_IS_ORIGIN(circ)) {
char old_purpose_desc[80] = "";
+31
View File
@@ -24,6 +24,7 @@
#include "feature/nodelist/describe.h"
#include "feature/nodelist/nodelist.h"
#include "feature/rend/rendservice.h"
#include "feature/rend/rendcommon.h"
#include "feature/stats/rephist.h"
#include "lib/crypt_ops/crypto_dh.h"
#include "lib/crypt_ops/crypto_rand.h"
@@ -1269,3 +1270,33 @@ hs_circ_cleanup(circuit_t *circ)
hs_circuitmap_remove_circuit(circ);
}
}
/* The given circuit will be repurposed so take the appropriate actions. A
* cleanup from the HS maps and of all HS related structures is done.
*
* Once this function returns, the circuit can be safely repurposed. */
void
hs_circ_repurpose(circuit_t *circ)
{
origin_circuit_t *origin_circ;
tor_assert(circ);
/* Only repurposing an origin circuit is possible for HS. */
if (!CIRCUIT_IS_ORIGIN(circ)) {
return;
}
origin_circ = TO_ORIGIN_CIRCUIT(circ);
/* First, cleanup the circuit from the HS maps. */
hs_circ_cleanup(circ);
/* Depending on the version, different cleanup is done. */
if (origin_circ->rend_data) {
/* v2. */
rend_circ_cleanup(origin_circ);
} else if (origin_circ->hs_ident) {
/* v3. */
hs_ident_circuit_free(origin_circ->hs_ident);
}
}
+1
View File
@@ -16,6 +16,7 @@
/* Cleanup function when the circuit is closed or/and freed. */
void hs_circ_cleanup(circuit_t *circ);
void hs_circ_repurpose(circuit_t *circ);
/* Circuit API. */
int hs_circ_service_intro_has_opened(hs_service_t *service,
+11
View File
@@ -1045,3 +1045,14 @@ rend_circuit_pk_digest_eq(const origin_circuit_t *ocirc,
match:
return 1;
}
/* Cleanup the given circuit of all HS v2 data structure. */
void
rend_circ_cleanup(origin_circuit_t *circ)
{
tor_assert(circ);
/* Both fields are set to NULL with these. */
crypto_pk_free(circ->intro_key);
rend_data_free(circ->rend_data);
}
+2
View File
@@ -71,6 +71,8 @@ int rend_non_anonymous_mode_enabled(const or_options_t *options);
void assert_circ_anonymity_ok(const origin_circuit_t *circ,
const or_options_t *options);
void rend_circ_cleanup(origin_circuit_t *circ);
#ifdef RENDCOMMON_PRIVATE
STATIC int