Commit d256d4c0 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

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
d769cab3, 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.
parent 09618ffe
Loading
Loading
Loading
Loading

changes/bug8185_025

0 → 100644
+6 −0
Original line number Diff line number Diff line
  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.
+11 −0
Original line number Diff line number Diff line
@@ -390,6 +390,11 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
{
  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) {
    crypt_path_t *thishop; /* counter for repeated crypts */
    chan = circ->n_chan;
@@ -703,6 +708,12 @@ connection_edge_send_command(edge_connection_t *fromconn,
    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,
                                      relay_command, payload,
                                      payload_len, cpath_layer);