]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Don't package cells onto marked circuits.
authorNick Mathewson <nickm@torproject.org>
Fri, 29 Sep 2017 13:26:16 +0000 (09:26 -0400)
committerNick Mathewson <nickm@torproject.org>
Fri, 29 Sep 2017 13:33:47 +0000 (09:33 -0400)
This caused a BUG log when we noticed that the circuit had no
channel.  The likeliest culprit for exposing that behavior is
d769cab3e5097980, 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.

changes/bug8185_025 [new file with mode: 0644]
src/or/relay.c

diff --git a/changes/bug8185_025 b/changes/bug8185_025
new file mode 100644 (file)
index 0000000..1bfc12b
--- /dev/null
@@ -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.
index daf354c34ce5d7f596398ef7312ffbefb0186572..48c823423a0a596a5c43b9eed4da08daef66f2fa 100644 (file)
@@ -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);