[tor-commits] [tor/master] 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()

andrea at torproject.org andrea at torproject.org
Thu Oct 11 02:05:24 UTC 2012


commit b28119e6a86fb910c02f53ee5e0154f8d15dc1e4
Author: Andrea Shepard <andrea at torproject.org>
Date:   Mon Oct 1 14:22:53 2012 -0700

    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()
---
 src/or/circuitlist.c |   14 +++++++++++++-
 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 a87f989..5140600 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 f0f4b2a..89e957c 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);





More information about the tor-commits mailing list