[tor-commits] [tor/master] Fix handling of ISO_STREAM
nickm at torproject.org
nickm at torproject.org
Mon Aug 8 13:45:17 UTC 2011
commit cab3641638540834a0867f26eb5b432fd793fd5e
Author: Robert Ransom <rransom.8774 at gmail.com>
Date: Sat Aug 6 13:42:32 2011 -0700
Fix handling of ISO_STREAM
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 | 9 ++++++---
src/or/or.h | 3 +++
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 971cee2..37a695c 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -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;
diff --git a/src/or/or.h b/src/or/or.h
index eb271b5..9c5d354 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -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;
More information about the tor-commits
mailing list