Don't package cells onto marked circuits.

This caused a BUG log when we noticed that the circuit had no
channel.  The likeliest culprit for exposing that behavior is
d769cab3e5, where we made circuit_mark_for_close() NULL out
the n_chan and p_chan fields of the circuit.

Fixes bug 8185; bugfix on 0.2.5.4-alpha, I think.
This commit is contained in:
Nick Mathewson 2017-09-29 09:26:16 -04:00
parent 09618ffe38
commit d256d4c0a6
2 changed files with 17 additions and 0 deletions

6
changes/bug8185_025 Normal file
View File

@ -0,0 +1,6 @@
o Minor bugfixes (logging, relay shutdown, annoyance):
- When a circuit is marked for close, do not attempt to package any cells
for channels on that circuit. Previously, we would detect this
condition lower in the call stack, when we noticed that the circuit had
no attached channel, and log an annoying message. Fixes bug 8185;
bugfix on 0.2.5.4-alpha.

View File

@ -390,6 +390,11 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
{ {
channel_t *chan; /* where to send the cell */ channel_t *chan; /* where to send the cell */
if (circ->marked_for_close) {
/* Circuit is marked; send nothing. */
return 0;
}
if (cell_direction == CELL_DIRECTION_OUT) { if (cell_direction == CELL_DIRECTION_OUT) {
crypt_path_t *thishop; /* counter for repeated crypts */ crypt_path_t *thishop; /* counter for repeated crypts */
chan = circ->n_chan; chan = circ->n_chan;
@ -703,6 +708,12 @@ connection_edge_send_command(edge_connection_t *fromconn,
return -1; return -1;
} }
if (circ->marked_for_close) {
/* The circuit has been marked, but not freed yet. When it's freed, it
* will mark this connection for close. */
return -1;
}
return relay_send_command_from_edge(fromconn->stream_id, circ, return relay_send_command_from_edge(fromconn->stream_id, circ,
relay_command, payload, relay_command, payload,
payload_len, cpath_layer); payload_len, cpath_layer);