|
@@ -2585,17 +2585,29 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
|
|
|
|
|
|
tor_assert(chan);
|
|
|
|
|
|
- memset(&cell, 0, sizeof(cell_t));
|
|
|
- cell.circ_id = circ_id;
|
|
|
- cell.command = CELL_DESTROY;
|
|
|
- cell.payload[0] = (uint8_t) reason;
|
|
|
- log_debug(LD_OR,
|
|
|
- "Sending destroy (circID %d) on channel %p "
|
|
|
- "(global ID " U64_FORMAT ")",
|
|
|
- circ_id, chan,
|
|
|
- U64_PRINTF_ARG(chan->global_identifier));
|
|
|
+ /* Check to make sure we can send on this channel first */
|
|
|
+ if (!(chan->state == CHANNEL_STATE_CLOSING ||
|
|
|
+ chan->state == CHANNEL_STATE_CLOSED ||
|
|
|
+ chan->state == CHANNEL_STATE_ERROR)) {
|
|
|
+ memset(&cell, 0, sizeof(cell_t));
|
|
|
+ cell.circ_id = circ_id;
|
|
|
+ cell.command = CELL_DESTROY;
|
|
|
+ cell.payload[0] = (uint8_t) reason;
|
|
|
+ log_debug(LD_OR,
|
|
|
+ "Sending destroy (circID %d) on channel %p "
|
|
|
+ "(global ID " U64_FORMAT ")",
|
|
|
+ circ_id, chan,
|
|
|
+ U64_PRINTF_ARG(chan->global_identifier));
|
|
|
|
|
|
- channel_write_cell(chan, &cell);
|
|
|
+ channel_write_cell(chan, &cell);
|
|
|
+ } else {
|
|
|
+ log_warn(LD_BUG,
|
|
|
+ "Someone called channel_send_destroy() for circID %d "
|
|
|
+ "on a channel " U64_FORMAT " at %p in state %s (%d)",
|
|
|
+ circ_id, U64_PRINTF_ARG(chan->global_identifier),
|
|
|
+ chan, channel_state_to_string(chan->state),
|
|
|
+ chan->state);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|