diff options
author | Andrea Shepard <andrea@torproject.org> | 2012-10-01 14:22:53 -0700 |
---|---|---|
committer | Andrea Shepard <andrea@torproject.org> | 2012-10-10 00:44:46 -0700 |
commit | b28119e6a86fb910c02f53ee5e0154f8d15dc1e4 (patch) | |
tree | 63a53b8d5fd5b7a43b251e4f91dba6bbb4b6027b /src/or | |
parent | c097fb33fc081165a55f0b9417d7c8bf5dc91cd6 (diff) | |
download | tor-b28119e6a86fb910c02f53ee5e0154f8d15dc1e4.tar.gz tor-b28119e6a86fb910c02f53ee5e0154f8d15dc1e4.zip |
Fix detach when setting circuit ID to 0 bug in circuit_set_circid_chan_helper() and add circuit_get_by_circid_channel_even_if_marked()
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/circuitlist.c | 14 | ||||
-rw-r--r-- | src/or/circuitlist.h | 3 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index a87f989f34..51406001a7 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -135,7 +135,7 @@ circuit_set_circid_chan_helper(circuit_t *circ, int direction, * attached), detach the circuit. ID changes require this because * circuitmux hashes on (channel_id, circuit_id). */ - if (id != 0 && (old_chan != chan || old_id != id) && + if (old_id != 0 && (old_chan != chan || old_id != id) && !(circ->marked_for_close)) { tor_assert(old_chan->cmux); circuitmux_detach_circuit(old_chan->cmux, circ); @@ -986,6 +986,18 @@ circuit_get_by_circid_channel(circid_t circ_id, channel_t *chan) return circ; } +/** Return a circ such that: + * - circ-\>n_circ_id or circ-\>p_circ_id is equal to <b>circ_id</b>, and + * - circ is attached to <b>chan</b>, either as p_chan or n_chan. + * Return NULL if no such circuit exists. + */ +circuit_t * +circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, + channel_t *chan) +{ + return circuit_get_by_circid_channel_impl(circ_id, chan); +} + /** Return true iff the circuit ID <b>circ_id</b> is currently used by a * circuit, marked or not, on <b>chan</b>. */ int diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index f0f4b2a6df..89e957c70a 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -30,6 +30,9 @@ origin_circuit_t *origin_circuit_new(void); or_circuit_t *or_circuit_new(circid_t p_circ_id, channel_t *p_chan); circuit_t *circuit_get_by_circid_channel(circid_t circ_id, channel_t *chan); +circuit_t * +circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, + channel_t *chan); int circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan); circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn); void circuit_unlink_all_from_channel(channel_t *chan, int reason); |