From c534b96e585e33044a55d00e8e5633cb8503dee3 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Sat, 1 Nov 2008 20:27:41 +0000 Subject: [PATCH] Fix an assertion failure on double-marked circuits, and a double-mark. svn:r17179 --- ChangeLog | 4 +++- src/or/circuitlist.c | 18 +++++++++++++----- src/or/circuituse.c | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 01584aa2c6..de020c5ce1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Changes in version 0.2.1.7-alpha - 2008-10-xx +Changes in version 0.2.1.7-alpha - 2008-11-xx o Security fixes: - The "ClientDNSRejectInternalAddresses" config option wasn't being consistently obeyed: if an exit relay refuses a stream because its @@ -120,6 +120,8 @@ Changes in version 0.2.1.6-alpha - 2008-09-30 - Make TrackHostExit mappings expire a while after their last use, not after their creation. Patch from Robert Hogan. - Provide circuit purposes along with circuit events to the controller. + - Make the assert_circuit_ok() function work correctly on circuits that + have already been marked for close. o Minor bugfixes: - Fix compile on OpenBSD 4.4-current. Bugfix on 0.2.1.5-alpha. diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 9dbec897c9..6d183fb9b1 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -1208,13 +1208,21 @@ assert_circuit_ok(const circuit_t *c) if (c->n_conn) { tor_assert(!c->n_hop); - if (c->n_circ_id) - tor_assert(c == circuit_get_by_circid_orconn(c->n_circ_id, c->n_conn)); + if (c->n_circ_id) { + /* We use the _impl variant here to make sure we don't fail on marked + * circuits, which would not be returned by the regular function. */ + circuit_t *c2 = circuit_get_by_circid_orconn_impl(c->n_circ_id, + c->n_conn); + tor_assert(c == c2); + } } if (or_circ && or_circ->p_conn) { - if (or_circ->p_circ_id) - tor_assert(c == circuit_get_by_circid_orconn(or_circ->p_circ_id, - or_circ->p_conn)); + if (or_circ->p_circ_id) { + /* ibid */ + circuit_t *c2 = circuit_get_by_circid_orconn_impl(or_circ->p_circ_id, + or_circ->p_conn); + tor_assert(c == c2); + } } #if 0 /* false now that rendezvous exits are attached to p_streams */ if (origin_circ) diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 8f4788064d..14acbf5e6c 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1495,7 +1495,7 @@ connection_ap_handshake_attach_circuit(edge_connection_t *conn) /* abort parallel intro circs, if any */ for (c = global_circuitlist; c; c = c->next) { if (c->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && - CIRCUIT_IS_ORIGIN(c)) { + !c->marked_for_close && CIRCUIT_IS_ORIGIN(c)) { origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(c); if (oc->rend_data && !rend_cmp_service_ids(conn->rend_data->onion_address,