]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
relay: Protocol warn when a client gets an extend
authorteor <teor@torproject.org>
Wed, 18 Mar 2020 08:07:14 +0000 (18:07 +1000)
committerteor <teor@torproject.org>
Thu, 9 Apr 2020 00:59:51 +0000 (10:59 +1000)
circuit_extend() may be called when a client receives an extend cell,
even if the relay module is disabled.

Log a protocol warning when the relay module is disabled.

Part of 33633.

src/feature/relay/circuitbuild_relay.c
src/feature/relay/circuitbuild_relay.h

index f167d0a8e4ee457749d4a64e1f8f06332520228c..9da89953fbbdbf81486e451b97a99ff13866e07c 100644 (file)
 #include "feature/relay/routermode.h"
 #include "feature/relay/selftest.h"
 
-/** Take the 'extend' <b>cell</b>, pull out addr/port plus the onion
- * skin and identity digest for the next hop. If we're already connected,
- * pass the onion skin to the next hop using a create cell; otherwise
- * launch a new OR connection, and <b>circ</b> will notice when the
- * connection succeeds or fails.
+/* Before replying to an extend cell, check the state of the circuit
+ * <b>circ</b>, and the configured tor mode.
  *
  * Return -1 if we want to warn and tear down the circuit, else return 0.
  */
@@ -56,6 +53,11 @@ circuit_extend(struct cell_t *cell, struct circuit_t *circ)
   const char *msg = NULL;
   int should_launch = 0;
 
+  if (!server_mode(get_options())) {
+    circuitbuild_warn_client_extend();
+    return -1;
+  }
+
   if (circ->n_chan) {
     log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
            "n_chan already set. Bug/attack. Closing.");
@@ -67,12 +69,6 @@ circuit_extend(struct cell_t *cell, struct circuit_t *circ)
     return -1;
   }
 
-  if (!server_mode(get_options())) {
-    log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
-           "Got an extend cell, but running as a client. Closing.");
-    return -1;
-  }
-
   relay_header_unpack(&rh, cell->payload);
 
   if (extend_cell_parse(&ec, rh.command,
index decc28d3a8c8f4021202a441975236265b54ff9b..890b40dc200717e09165b7cfeec798d9ffa62410 100644 (file)
@@ -13,6 +13,9 @@
 #define TOR_FEATURE_RELAY_CIRCUITBUILD_RELAY_H
 
 #include "lib/cc/torint.h"
+#include "lib/log/log.h"
+
+#include "app/config/config.h"
 
 struct cell_t;
 struct created_cell_t;
@@ -20,6 +23,14 @@ struct created_cell_t;
 struct circuit_t;
 struct or_circuit_t;
 
+/* Log a protocol warning about getting an extend cell on a client. */
+static inline void
+circuitbuild_warn_client_extend(void)
+{
+  log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
+         "Got an extend cell, but running as a client. Closing.");
+}
+
 #ifdef HAVE_MODULE_RELAY
 
 int circuit_extend(struct cell_t *cell, struct circuit_t *circ);
@@ -36,7 +47,7 @@ circuit_extend(struct cell_t *cell, struct circuit_t *circ)
 {
   (void)cell;
   (void)circ;
-  tor_assert_nonfatal_unreached();
+  circuitbuild_warn_client_extend();
   return -1;
 }