]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix handling of ISO_STREAM
authorRobert Ransom <rransom.8774@gmail.com>
Sat, 6 Aug 2011 20:42:32 +0000 (13:42 -0700)
committerNick Mathewson <nickm@torproject.org>
Mon, 8 Aug 2011 13:42:48 +0000 (09:42 -0400)
Now we track *which* stream with ISO_STREAM set is associated to a
particular circuit, so that we won't think that stream is incompatible
with its circuit and launch another one a second later, and we use that
same field to mark circuits which have had an ISO_STREAM stream attached
to them, so that we won't ever put a second stream on that circuit.

Fixes bug 3695.

src/or/connection_edge.c
src/or/or.h

index 971cee2d6b24e2bb4cd626a37315f0d8362fd87c..37a695cfb1a8ec8f355097a96769dce8b28bdec1 100644 (file)
@@ -3432,9 +3432,9 @@ connection_edge_compatible_with_circuit(const edge_connection_t *conn,
       tor_strdup(conn->socks_request->address);
   }
 
-  /* If isolation_values_set, then the circuit is not compatible with
-   * any new ISO_STREAM stream. */
-  if (iso & ISO_STREAM)
+  if ((iso & ISO_STREAM) &&
+      (circ->associated_isolated_stream_global_id !=
+       TO_CONN(conn)->global_identifier))
     return 0;
 
   if ((iso & ISO_DESTPORT) && conn->socks_request->port != circ->dest_port)
@@ -3487,6 +3487,8 @@ connection_edge_update_circuit_isolation(const edge_connection_t *conn,
   if (!circ->isolation_values_set) {
     if (dry_run)
       return -1;
+    circ->associated_isolated_stream_global_id =
+      TO_CONN(conn)->global_identifier;
     circ->dest_port = conn->socks_request->port;
     circ->dest_address = tor_strdup(conn->original_dest_address);
     circ->client_proto_type = conn->socks_request->listener_type;
@@ -3562,6 +3564,7 @@ circuit_clear_isolation(origin_circuit_t *circ)
 
   circ->isolation_values_set = 0;
   circ->isolation_flags_mixed = 0;
+  circ->associated_isolated_stream_global_id = 0;
   circ->client_proto_type = 0;
   circ->client_proto_socksver = 0;
   circ->dest_port = 0;
index eb271b5ee49f2b82457b82340d6a915effe0bd91..9c5d354c78a4468e1231047b5ddcf55865e4e9e7 100644 (file)
@@ -2530,6 +2530,9 @@ typedef struct origin_circuit_t {
      socks_username_len and socks_password_len for their lengths. */
   char *socks_username;
   char *socks_password;
+  /** Global identifier for the first stream attached here; used by
+   * ISO_STREAM. */
+  uint64_t associated_isolated_stream_global_id;
   /**@}*/
 
 } origin_circuit_t;