aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-10-02 22:40:01 -0400
committerNick Mathewson <nickm@torproject.org>2013-10-02 22:40:01 -0400
commit566645b5edb25aec55e6dffaf6f522456f661a9e (patch)
tree75b48f428e709db313639fe004244812be3dc1d1
parente65b54ec75e3c9e9ada33c8f3ee868d1bea167f5 (diff)
parent0bec65277abed5567458e94c05c2b94f1b84e460 (diff)
downloadtor-566645b5edb25aec55e6dffaf6f522456f661a9e.tar
tor-566645b5edb25aec55e6dffaf6f522456f661a9e.tar.gz
Merge remote-tracking branch 'origin/maint-0.2.4'
-rw-r--r--changes/bug98808
-rw-r--r--src/or/channel.c7
-rw-r--r--src/or/channel.h3
3 files changed, 17 insertions, 1 deletions
diff --git a/changes/bug9880 b/changes/bug9880
new file mode 100644
index 000000000..a7dda8f82
--- /dev/null
+++ b/changes/bug9880
@@ -0,0 +1,8 @@
+ o Minor bugfixes:
+
+ - When closing a channel that has already been open, do not close
+ pending circuits that were waiting to connect to the same relay.
+ Fixes bug 9880; bugfix on 0.2.5.1-alpha. Thanks to skruffy for
+ finding this bug. (Bug was merged to 0.2.4 branch but not released
+ in any 0.2.4 version)
+
diff --git a/src/or/channel.c b/src/or/channel.c
index afe28bf5e..a345bab20 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -745,6 +745,9 @@ channel_init(channel_t *chan)
/* Timestamp it */
channel_timestamp_created(chan);
+
+ /* It hasn't been open yet. */
+ chan->has_been_open = 0;
}
/**
@@ -1297,7 +1300,8 @@ channel_closed(channel_t *chan)
/* Inform any pending (not attached) circs that they should
* give up. */
- circuit_n_chan_done(chan, 0);
+ if (! chan->has_been_open)
+ circuit_n_chan_done(chan, 0);
/* Now close all the attached circuits on it. */
circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED);
@@ -1945,6 +1949,7 @@ channel_change_state(channel_t *chan, channel_state_t to_state)
/* Tell circuits if we opened and stuff */
if (to_state == CHANNEL_STATE_OPEN) {
channel_do_open_actions(chan);
+ chan->has_been_open = 1;
/* Check for queued cells to process */
if (! TOR_SIMPLEQ_EMPTY(&chan->incoming_queue))
diff --git a/src/or/channel.h b/src/or/channel.h
index 430a0251a..7e3f5ad07 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -45,6 +45,9 @@ struct channel_s {
/* Should we expect to see this channel in the channel lists? */
unsigned char registered:1;
+ /** has this channel ever been open? */
+ unsigned int has_been_open:1;
+
/** Why did we close?
*/
enum {