tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit ba63c4099a491c3f96160005f94cf3a61433c145
parent 97702c69b03b19a8a6f867e56f716ce984550fa0
Author: David Goulet <dgoulet@torproject.org>
Date:   Mon, 25 Sep 2017 16:47:16 -0400

hs-v3: Don't cleanup intro point in has_closed()

The hs_service_intro_circ_has_closed() was removing intro point objects if too
many retries.

We shouldn't cleanup those objects in that function at all but rather let
cleanup_intro_points() do its job and clean it properly.

This was causing an issue in #23603.

Furthermore, this moves the logic of remembering failing intro points in the
cleanup_intro_points() function which should really be the only function to
know when to cleanup and thus when an introduction point should be remembered
as a failed one.

Fixes #23603

Signed-off-by: David Goulet <dgoulet@torproject.org>

Diffstat:
Msrc/or/hs_service.c | 15++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/src/or/hs_service.c b/src/or/hs_service.c @@ -1839,6 +1839,12 @@ cleanup_intro_points(hs_service_t *service, time_t now) (node == NULL) ? " fell off the consensus" : "", ip->circuit_retries); + /* We've retried too many times, remember it as a failed intro point + * so we don't pick it up again for INTRO_CIRC_RETRY_PERIOD sec. */ + if (ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) { + remember_failing_intro_point(ip, desc, approx_time()); + } + /* Remove intro point from descriptor map. We'll add it to the failed * map if we retried it too many times. */ MAP_DEL_CURRENT(key); @@ -2946,15 +2952,6 @@ hs_service_intro_circ_has_closed(origin_circuit_t *circ) * keeping the object in the descriptor, we'll be able to retry. */ ip->circuit_established = 0; - /* We've retried too many times, remember it as a failed intro point so we - * don't pick it up again. It will be retried in INTRO_CIRC_RETRY_PERIOD - * seconds. */ - if (ip->circuit_retries > MAX_INTRO_POINT_CIRCUIT_RETRIES) { - remember_failing_intro_point(ip, desc, approx_time()); - service_intro_point_remove(service, ip); - service_intro_point_free(ip); - } - end: return; }