diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/or/channel.c | 7 | ||||
-rw-r--r-- | src/or/channel.h | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/or/channel.c b/src/or/channel.c index 1fb39b88ca..1270eace7d 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -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)) diff --git a/src/or/channel.h b/src/or/channel.h index 0933ec8d39..2dca81705f 100644 --- a/src/or/channel.h +++ b/src/or/channel.h @@ -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 { |