[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r10058: Misc cleanup and bulletproofing on r10056. (in tor/trunk: . doc/spec src/or)



Author: nickm
Date: 2007-04-30 10:09:11 -0400 (Mon, 30 Apr 2007)
New Revision: 10058

Modified:
   tor/trunk/
   tor/trunk/doc/spec/control-spec.txt
   tor/trunk/src/or/circuitlist.c
   tor/trunk/src/or/circuituse.c
   tor/trunk/src/or/connection_edge.c
Log:
 r12565@catbus:  nickm | 2007-04-30 10:09:07 -0400
 Misc cleanup and bulletproofing on r10056.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r12565] on 8246c3cf-6607-4228-993b-4d95d33730f1

Modified: tor/trunk/doc/spec/control-spec.txt
===================================================================
--- tor/trunk/doc/spec/control-spec.txt	2007-04-30 13:17:57 UTC (rev 10057)
+++ tor/trunk/doc/spec/control-spec.txt	2007-04-30 14:09:11 UTC (rev 10058)
@@ -535,7 +535,7 @@
 3.13. ATTACHSTREAM
 
   Sent from the client to the server.  The syntax is:
-     "ATTACHSTREAM" SP StreamID SP CircuitID ["HOP=" HopNum] CRLF
+     "ATTACHSTREAM" SP StreamID SP CircuitID [SP "HOP=" HopNum] CRLF
 
   This message informs the server that the specified stream should be
   associated with the specified circuit.  Each stream may be associated with
@@ -549,6 +549,7 @@
 
   If HOP=HopNum is specified, Tor will choose the HopNumth hop in the
   circuit as the exit node, rather than the last node in the circuit.
+  Hops are 1-indexed; generally, it is not permitted to attach to hop 1.
 
   Tor responds with "250 OK" if it can attach the stream, 552 if the circuit
   or stream didn't exist, or 551 if the stream couldn't be attached for

Modified: tor/trunk/src/or/circuitlist.c
===================================================================
--- tor/trunk/src/or/circuitlist.c	2007-04-30 13:17:57 UTC (rev 10057)
+++ tor/trunk/src/or/circuitlist.c	2007-04-30 14:09:11 UTC (rev 10058)
@@ -849,7 +849,7 @@
 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;

Modified: tor/trunk/src/or/circuituse.c
===================================================================
--- tor/trunk/src/or/circuituse.c	2007-04-30 13:17:57 UTC (rev 10057)
+++ tor/trunk/src/or/circuituse.c	2007-04-30 14:09:11 UTC (rev 10058)
@@ -1096,9 +1096,23 @@
   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 @@
   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 @@
                       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,

Modified: tor/trunk/src/or/connection_edge.c
===================================================================
--- tor/trunk/src/or/connection_edge.c	2007-04-30 13:17:57 UTC (rev 10057)
+++ tor/trunk/src/or/connection_edge.c	2007-04-30 14:09:11 UTC (rev 10058)
@@ -1178,6 +1178,10 @@
  * 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,