diff options
author | Nick Mathewson <nickm@torproject.org> | 2015-01-07 10:27:22 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2015-01-07 10:27:22 -0500 |
commit | b56c7614b64a3129df069e3ec161973073b127ef (patch) | |
tree | ccabbe702a072cfc4b2ec194d8211d06ce991904 /src/or/channel.c | |
parent | 79aaad952f4f43a7057c4162ae378d5bad28a77e (diff) | |
download | tor-b56c7614b64a3129df069e3ec161973073b127ef.tar.gz tor-b56c7614b64a3129df069e3ec161973073b127ef.zip |
When closing circs build through a new guard, only close local ones
If we decide not to use a new guard because we want to retry older
guards, only close the locally-originating circuits passing through
that guard. Previously we would close all the circuits.
Fixes bug 9819; bugfix on 0.2.1.1-alpha. Reported by "skruffy".
Diffstat (limited to 'src/or/channel.c')
-rw-r--r-- | src/or/channel.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/or/channel.c b/src/or/channel.c index 062ae3370e..bf0387f10e 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -56,7 +56,6 @@ static smartlist_t *finished_listeners = NULL; /* Counter for ID numbers */ static uint64_t n_channels_allocated = 0; - /* * Channel global byte/cell counters, for statistics and for scheduler high * /low-water marks. @@ -1329,7 +1328,7 @@ channel_closed(channel_t *chan) /* Inform any pending (not attached) circs that they should * give up. */ if (! chan->has_been_open) - circuit_n_chan_done(chan, 0); + circuit_n_chan_done(chan, 0, 0); /* Now close all the attached circuits on it. */ circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED); @@ -2527,8 +2526,9 @@ void channel_do_open_actions(channel_t *chan) { tor_addr_t remote_addr; - int started_here, not_using = 0; + int started_here; time_t now = time(NULL); + int close_origin_circuits = 0; tor_assert(chan); @@ -2545,8 +2545,7 @@ channel_do_open_actions(channel_t *chan) log_debug(LD_OR, "New entry guard was reachable, but closing this " "connection so we can retry the earlier entry guards."); - circuit_n_chan_done(chan, 0); - not_using = 1; + close_origin_circuits = 1; } router_set_status(chan->identity_digest, 1); } else { @@ -2566,7 +2565,7 @@ channel_do_open_actions(channel_t *chan) } } - if (!not_using) circuit_n_chan_done(chan, 1); + circuit_n_chan_done(chan, 1, close_origin_circuits); } /** |