hs-v2: Modernize rend_client_circuit_cleanup() code

Old and messy code path. Structure it in a more pleasant and readable way. No
behavior change with this refactor.

Part of #32020

Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
David Goulet 2019-10-30 15:17:47 -04:00 committed by George Kadianakis
parent 00136c9430
commit 1aafe3376e
2 changed files with 51 additions and 36 deletions

View File

@ -1254,47 +1254,62 @@ rend_parse_service_authorization(const or_options_t *options,
/** The given circuit is being freed. Take appropriate action if it is of /** The given circuit is being freed. Take appropriate action if it is of
* interest to the client subsystem. */ * interest to the client subsystem. */
void void
rend_client_circuit_cleanup(circuit_t *circ) rend_client_circuit_cleanup(const circuit_t *circ)
{ {
int reason = circ->marked_for_close_reason; int reason, orig_reason;
int orig_reason = circ->marked_for_close_orig_reason; bool has_timed_out, ip_is_redundant;
const origin_circuit_t *ocirc = NULL;
tor_assert(circ); tor_assert(circ);
tor_assert(CIRCUIT_IS_ORIGIN(circ));
if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) { reason = circ->marked_for_close_reason;
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); orig_reason = circ->marked_for_close_orig_reason;
int timed_out = (reason == END_CIRC_REASON_TIMEOUT); ocirc = CONST_TO_ORIGIN_CIRCUIT(circ);
tor_assert(ocirc->rend_data);
has_timed_out = (reason == END_CIRC_REASON_TIMEOUT);
ip_is_redundant = (orig_reason == END_CIRC_REASON_IP_NOW_REDUNDANT);
switch (circ->purpose) {
case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT:
{
if (ip_is_redundant) {
break;
}
tor_assert(circ->state == CIRCUIT_STATE_OPEN); tor_assert(circ->state == CIRCUIT_STATE_OPEN);
tor_assert(ocirc->build_state->chosen_exit); tor_assert(ocirc->build_state->chosen_exit);
if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT && /* Treat this like getting a nack from it */
ocirc->rend_data) { log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s",
/* treat this like getting a nack from it */ safe_str_client(rend_data_get_address(ocirc->rend_data)),
log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s", safe_str_client(build_state_get_exit_nickname(ocirc->build_state)),
safe_str_client(rend_data_get_address(ocirc->rend_data)), has_timed_out ? "Recording timeout." : "Removing from descriptor.");
safe_str_client(build_state_get_exit_nickname(ocirc->build_state)), rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
timed_out ? "Recording timeout." : "Removing from descriptor."); ocirc->rend_data,
rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit, has_timed_out ?
ocirc->rend_data, INTRO_POINT_FAILURE_TIMEOUT :
timed_out ? INTRO_POINT_FAILURE_GENERIC);
INTRO_POINT_FAILURE_TIMEOUT : break;
INTRO_POINT_FAILURE_GENERIC); }
} case CIRCUIT_PURPOSE_C_INTRODUCING:
} else if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && {
reason != END_CIRC_REASON_TIMEOUT) { /* Ignore if we were introducing and it timed out, we didn't pick an exit
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ); * point yet (IP) or the reason indicate that it was a redundant IP. */
if (ocirc->build_state->chosen_exit && ocirc->rend_data) { if (has_timed_out || !ocirc->build_state->chosen_exit || ip_is_redundant) {
if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT && break;
ocirc->rend_data) {
log_info(LD_REND, "Failed intro circ %s to %s "
"(building circuit to intro point). "
"Marking intro point as possibly unreachable.",
safe_str_client(rend_data_get_address(ocirc->rend_data)),
safe_str_client(build_state_get_exit_nickname(
ocirc->build_state)));
rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
ocirc->rend_data,
INTRO_POINT_FAILURE_UNREACHABLE);
}
} }
log_info(LD_REND, "Failed intro circ %s to %s "
"(building circuit to intro point). "
"Marking intro point as possibly unreachable.",
safe_str_client(rend_data_get_address(ocirc->rend_data)),
safe_str_client(build_state_get_exit_nickname(
ocirc->build_state)));
rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
ocirc->rend_data,
INTRO_POINT_FAILURE_UNREACHABLE);
break;
}
default:
break;
} }
} }

View File

@ -47,7 +47,7 @@ rend_service_authorization_t *rend_client_lookup_service_authorization(
const char *onion_address); const char *onion_address);
void rend_service_authorization_free_all(void); void rend_service_authorization_free_all(void);
void rend_client_circuit_cleanup(circuit_t *circ); void rend_client_circuit_cleanup(const circuit_t *circ);
#endif /* !defined(TOR_RENDCLIENT_H) */ #endif /* !defined(TOR_RENDCLIENT_H) */