mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
prop224: Try to recover from a bad intro circuit
Changed the assert_intro_circ_ok() to an almost non fatal function so tor can recover properly. We keep the anonymity assert because if that is not right, we have much deeper problems and client should stop sending bytes to the network immediately. Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
5f94c4a0f1
commit
954f663831
@ -179,16 +179,33 @@ fetch_v3_desc(const ed25519_public_key_t *onion_identity_pk)
|
||||
return directory_launch_v3_desc_fetch(onion_identity_pk, hsdir_rs);
|
||||
}
|
||||
|
||||
/* Make sure that the given origin circuit circ is a valid correct
|
||||
* introduction circuit. This asserts on validation failure. */
|
||||
static void
|
||||
assert_intro_circ_ok(const origin_circuit_t *circ)
|
||||
/* Make sure that the given v3 origin circuit circ is a valid correct
|
||||
* introduction circuit. This will BUG() on any problems and hard assert if
|
||||
* the anonymity of the circuit is not ok. Return 0 on success else -1 where
|
||||
* the circuit should be mark for closed immediately. */
|
||||
static int
|
||||
intro_circ_is_ok(const origin_circuit_t *circ)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
tor_assert(circ);
|
||||
tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
|
||||
tor_assert(circ->hs_ident);
|
||||
tor_assert(hs_ident_intro_circ_is_valid(circ->hs_ident));
|
||||
|
||||
if (BUG(TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCING &&
|
||||
TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT &&
|
||||
TO_CIRCUIT(circ)->purpose != CIRCUIT_PURPOSE_C_INTRODUCE_ACKED)) {
|
||||
ret = -1;
|
||||
}
|
||||
if (BUG(circ->hs_ident == NULL)) {
|
||||
ret = -1;
|
||||
}
|
||||
if (BUG(!hs_ident_intro_circ_is_valid(circ->hs_ident))) {
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
/* This can stop the tor daemon but we want that since if we don't have
|
||||
* anonymity on this circuit, something went really wrong. */
|
||||
assert_circ_anonymity_ok(circ, get_options());
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Find a descriptor intro point object that matches the given ident in the
|
||||
@ -264,8 +281,10 @@ send_introduce1(origin_circuit_t *intro_circ,
|
||||
const ed25519_public_key_t *service_identity_pk = NULL;
|
||||
const hs_desc_intro_point_t *ip;
|
||||
|
||||
assert_intro_circ_ok(intro_circ);
|
||||
tor_assert(rend_circ);
|
||||
if (intro_circ_is_ok(intro_circ) < 0) {
|
||||
goto perm_err;
|
||||
}
|
||||
|
||||
service_identity_pk = &intro_circ->hs_ident->identity_pk;
|
||||
/* For logging purposes. There will be a time where the hs_ident will have a
|
||||
|
Loading…
Reference in New Issue
Block a user