diff --git a/changes/bug21302 b/changes/bug21302 new file mode 100644 index 0000000000..351b23ea2c --- /dev/null +++ b/changes/bug21302 @@ -0,0 +1,8 @@ + o Minor bugfixes (hidden service): + - Two possible underflow which would ultimately lead to creating a lot of + introduction points circuits and closing them in a non stop loop. Fixes + bug 21302; bugfix on tor-0.2.7.2-alpha. + - Cleanup expiring intro point nodes if no circuit is associated to it + anymore. It was causing, rarely, the service to not open enough + introduction points circuit in the case we had dead expiring nodes.; + bugfix on tor-0.2.7.2-alpha. diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 0db81aed5f..4c5372cc43 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -3907,6 +3907,19 @@ remove_invalid_intro_points(rend_service_t *service, { tor_assert(service); + /* Remove any expired nodes that doesn't have a circuit. */ + SMARTLIST_FOREACH_BEGIN(service->expiring_nodes, rend_intro_point_t *, + intro) { + origin_circuit_t *intro_circ = + find_intro_circuit(intro, service->pk_digest); + if (intro_circ) { + continue; + } + /* No more circuit, cleanup the into point object. */ + SMARTLIST_DEL_CURRENT(service->expiring_nodes, intro); + rend_intro_point_free(intro); + } SMARTLIST_FOREACH_END(intro); + SMARTLIST_FOREACH_BEGIN(service->intro_nodes, rend_intro_point_t *, intro) { /* Find the introduction point node object. */