diff options
author | Roger Dingledine <arma@torproject.org> | 2009-02-13 04:11:14 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2009-02-13 04:11:14 +0000 |
commit | c8474f9d930f1eb6b43022ba6987358806db7a94 (patch) | |
tree | dc1080b351976ea1fce8930afc3cdf546fb85455 /src | |
parent | ed9b10dd2b58ec2ed44e18b7a734cc1430193d1f (diff) | |
download | tor-c8474f9d930f1eb6b43022ba6987358806db7a94.tar tor-c8474f9d930f1eb6b43022ba6987358806db7a94.tar.gz |
If the controller claimed responsibility for a stream, but that
stream never finished making its connection, it would live
forever in circuit_wait state. Now we close it after SocksTimeout
seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry.
svn:r18516
Diffstat (limited to 'src')
-rw-r--r-- | src/or/connection_edge.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index a157bdbb2..b02282d8d 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -397,7 +397,7 @@ connection_ap_expire_beginning(void) or_options_t *options = get_options(); int severity; int cutoff; - int seconds_idle; + int seconds_idle, seconds_since_born; smartlist_t *conns = get_connection_array(); SMARTLIST_FOREACH_BEGIN(conns, connection_t *, c) { @@ -408,18 +408,21 @@ connection_ap_expire_beginning(void) severity = (tor_addr_is_null(&conn->_base.addr) && !conn->_base.port) ? LOG_INFO : LOG_NOTICE; seconds_idle = (int)( now - conn->_base.timestamp_lastread ); + seconds_since_born = (int)( now - conn->_base.timestamp_created ); - /* XXX021 this clause was originally thought redundant with the - * clause in connection_ap_handshake_attach_circuit(). But actually, - * we need it because controllers that put streams in controller_wait - * state never go to the other clause. we should fix so it compares - * seconds since timestamp_created, not since last read. -RD */ + if (conn->_base.state == AP_CONN_STATE_OPEN) + continue; + + /* We already consider SocksTimeout in + * connection_ap_handshake_attach_circuit(), but we need to consider + * it here too because controllers that put streams in controller_wait + * state never ask Tor to attach the circuit. */ if (AP_CONN_STATE_IS_UNATTACHED(conn->_base.state)) { - if (seconds_idle >= options->SocksTimeout) { + if (seconds_since_born >= options->SocksTimeout) { log_fn(severity, LD_APP, "Tried for %d seconds to get a connection to %s:%d. " "Giving up. (%s)", - seconds_idle, safe_str(conn->socks_request->address), + seconds_since_born, safe_str(conn->socks_request->address), conn->socks_request->port, conn_state_to_string(CONN_TYPE_AP, conn->_base.state)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TIMEOUT); @@ -427,9 +430,6 @@ connection_ap_expire_beginning(void) continue; } - if (conn->_base.state == AP_CONN_STATE_OPEN) - continue; - /* We're in state connect_wait or resolve_wait now -- waiting for a * reply to our relay cell. See if we want to retry/give up. */ |