Fix a bug in our bug 9776 fix.

By calling circuit_n_chan_done() unconditionally on close, we were
closing pending connections that might not have been pending quite for
the connection we were closing.  Fix for bug 9880.

Thanks to skruffy for finding this and explaining it patiently until
we understood.
This commit is contained in:
Nick Mathewson 2013-10-02 21:42:24 -04:00
parent 938ee9b24d
commit 557f332957
3 changed files with 17 additions and 1 deletions

8
changes/bug9880 Normal file
View File

@ -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)

View File

@ -743,6 +743,9 @@ channel_init(channel_t *chan)
/* Timestamp it */
channel_timestamp_created(chan);
/* It hasn't been open yet. */
chan->has_been_open = 0;
}
/**
@ -1294,7 +1297,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);
@ -1935,6 +1939,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))

View File

@ -46,6 +46,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 {