Loading changes/bug29034 0 → 100644 +5 −0 Original line number Diff line number Diff line 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. src/core/or/circuituse.c +6 −0 Original line number Diff line number Diff line Loading @@ -3068,6 +3068,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] = ""; Loading src/feature/hs/hs_circuit.c +31 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,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" Loading Loading @@ -1192,3 +1193,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); } } src/feature/hs/hs_circuit.h +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading src/feature/rend/rendcommon.c +11 −0 Original line number Diff line number Diff line Loading @@ -1046,3 +1046,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); } Loading
changes/bug29034 0 → 100644 +5 −0 Original line number Diff line number Diff line 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.
src/core/or/circuituse.c +6 −0 Original line number Diff line number Diff line Loading @@ -3068,6 +3068,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] = ""; Loading
src/feature/hs/hs_circuit.c +31 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,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" Loading Loading @@ -1192,3 +1193,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); } }
src/feature/hs/hs_circuit.h +1 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
src/feature/rend/rendcommon.c +11 −0 Original line number Diff line number Diff line Loading @@ -1046,3 +1046,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); }