diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-04-30 14:09:11 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-04-30 14:09:11 +0000 |
commit | 43385b9bc9f658b2686e0a897a33c98a8b098716 (patch) | |
tree | 63473578ab953b49f6bfc47a378acf29bd482e76 /src/or | |
parent | 420df2ce15172d2738758debd6135ce1accb267b (diff) | |
download | tor-43385b9bc9f658b2686e0a897a33c98a8b098716.tar.gz tor-43385b9bc9f658b2686e0a897a33c98a8b098716.zip |
r12565@catbus: nickm | 2007-04-30 10:09:07 -0400
Misc cleanup and bulletproofing on r10056.
svn:r10058
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/circuitlist.c | 2 | ||||
-rw-r--r-- | src/or/circuituse.c | 27 | ||||
-rw-r--r-- | src/or/connection_edge.c | 4 |
3 files changed, 27 insertions, 6 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 839d2b6dc7..07fca3d156 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -849,7 +849,7 @@ circuit_get_cpath_len(origin_circuit_t *circ) crypt_path_t * circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum) { - if (circ && circ->cpath) { + if (circ && circ->cpath && hopnum > 0) { crypt_path_t *cpath, *cpath_next = NULL; for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { cpath_next = cpath->next; diff --git a/src/or/circuituse.c b/src/or/circuituse.c index c2faa109b5..427d788b11 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1096,9 +1096,23 @@ circuit_get_open_circ_or_launch(edge_connection_t *conn, return 0; } +/** Return true iff <b>crypt_path</b> is one of the crypt_paths for + * <b>circ</b> */ +static int +cpath_is_on_circuit(origin_circuit_t *circ, crypt_path_t *crypt_path) +{ + crypt_path_t *cpath, *cpath_next = NULL; + for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) { + cpath_next = cpath->next; + if (crypt_path == cpath) + return 1; + } + return 0; +} + /** Attach the AP stream <b>apconn</b> to circ's linked list of - * p_streams. Also set apconn's cpath_layer to the last hop in - * circ's cpath. + * p_streams. Also set apconn's cpath_layer to <b>cpath</b>, or to the last + * hop in circ's cpath if <b>cpath</b> is NULL. */ static void link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ, @@ -1115,6 +1129,7 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ, circ->p_streams = apconn; if (cpath) { /* we were given one; use it */ + tor_assert(cpath_is_on_circuit(circ, cpath)); apconn->cpath_layer = cpath; } else { /* use the last hop in the circuit */ tor_assert(circ->cpath); @@ -1172,9 +1187,11 @@ consider_recording_trackhost(edge_connection_t *conn, origin_circuit_t *circ) time(NULL) + options->TrackHostExitsExpire); } -/** Attempt to attach the connection <b>conn</b> to <b>circ</b>, and - * send a begin or resolve cell as appropriate. Return values are as - * for connection_ap_handshake_attach_circuit. */ +/** Attempt to attach the connection <b>conn</b> to <b>circ</b>, and send a + * begin or resolve cell as appropriate. Return values are as for + * connection_ap_handshake_attach_circuit. The stream will exit from the hop + * indicatd by <b>cpath</b>, or to the last hop in circ's cpath if + * <b>cpath</b> is NULL. */ int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, origin_circuit_t *circ, diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 035eecafc1..34d640014d 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -1178,6 +1178,10 @@ addressmap_get_mappings(smartlist_t *sl, time_t min_expires, * one as needed), else if it's for a rendezvous circuit, fetch a * rendezvous descriptor first (or attach/launch a circuit if the * rendezvous descriptor is already here and fresh enough). + * + * The stream will exit from the hop + * indicatd by <b>cpath</b>, or to the last hop in circ's cpath if + * <b>cpath</b> is NULL. */ int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, |