diff options
-rw-r--r-- | changes/bug9880 | 8 | ||||
-rw-r--r-- | src/or/channel.c | 7 | ||||
-rw-r--r-- | src/or/channel.h | 3 |
3 files changed, 17 insertions, 1 deletions
diff --git a/changes/bug9880 b/changes/bug9880 new file mode 100644 index 0000000000..a7dda8f82f --- /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 afe28bf5e5..a345bab20c 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 430a0251a2..7e3f5ad075 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 { |