summaryrefslogtreecommitdiff
path: root/src/or/channel.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2015-01-07 10:27:22 -0500
committerNick Mathewson <nickm@torproject.org>2015-01-07 10:27:22 -0500
commitb56c7614b64a3129df069e3ec161973073b127ef (patch)
treeccabbe702a072cfc4b2ec194d8211d06ce991904 /src/or/channel.c
parent79aaad952f4f43a7057c4162ae378d5bad28a77e (diff)
downloadtor-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.c11
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);
}
/**