]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Ignore regular cells in padding circuits.
authorGeorge Kadianakis <desnacked@riseup.net>
Mon, 5 Aug 2019 10:47:07 +0000 (13:47 +0300)
committerGeorge Kadianakis <desnacked@riseup.net>
Mon, 5 Aug 2019 10:48:58 +0000 (13:48 +0300)
Padding circuits were regular cells that got closed before their padding
machine could finish. This means that they can still receive regular cells from
their past life, but they have no way or reason to answer them anymore. Hence
let's ignore them before they even get to the proper subsystems.

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

diff --git a/changes/bug30942 b/changes/bug30942
new file mode 100644 (file)
index 0000000..bd6b2ff
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor bugfixes (circuit padding):
+    - Ignore non-padding cells on padding circuits. This addresses various
+      warning messages from subsystems that were not expecting padding
+      circuits. Fixes bug 30942; bugfix on 0.4.1.1-alpha.
\ No newline at end of file
index 9f90a0969966e62f7df6fb29901bb1d8c39862e2..9e691a02b564c2ad3a31d65cd19e363505a27e42 100644 (file)
@@ -1663,6 +1663,17 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
       if (circpad_handle_padding_negotiated(circ, cell, layer_hint) == 0)
         circuit_read_valid_data(TO_ORIGIN_CIRCUIT(circ), rh.length);
       return 0;
+  }
+
+  /* If this is a padding circuit we don't need to parse any other commands
+   * than the padding ones. Just drop them to the floor. */
+  if (circ->purpose == CIRCUIT_PURPOSE_C_CIRCUIT_PADDING) {
+    log_info(domain, "Ignored cell (%d) that arrived in padding circuit.",
+             rh.command);
+    return 0;
+  }
+
+  switch (rh.command) {
     case RELAY_COMMAND_BEGIN:
     case RELAY_COMMAND_BEGIN_DIR:
       if (layer_hint &&