Browse Source

Fix a crash when a connection tries to open just after it has been unlinked

Fixes bug 21576; bugfix on Tor 0.2.9.3-alpha.
Reported by alecmuffett.
teor 7 years ago
parent
commit
4b5cdb2c30
2 changed files with 13 additions and 3 deletions
  1. 4 0
      changes/bug21576
  2. 9 3
      src/or/connection_edge.c

+ 4 - 0
changes/bug21576

@@ -0,0 +1,4 @@
+  o Major bugfixes (crash, directory connections):
+    - Fix a rare crash when sending a begin cell on a circuit whose linked
+      directory connection has already been closed. Fixes bug 21576;
+      bugfix on Tor 0.2.9.3-alpha. Reported by alecmuffett.

+ 9 - 3
src/or/connection_edge.c

@@ -2437,10 +2437,16 @@ connection_ap_handshake_send_begin(entry_connection_t *ap_conn)
   } else if (begin_type == RELAY_COMMAND_BEGIN_DIR) {
     /* This connection is a begindir directory connection.
      * Look at the linked directory connection to access the directory purpose.
-     * (This must be non-NULL, because we're doing begindir.) */
-    tor_assert(base_conn->linked);
+     * If a BEGINDIR connection is ever not linked, that's a bug. */
+    if (BUG(!base_conn->linked)) {
+      return -1;
+    }
     connection_t *linked_dir_conn_base = base_conn->linked_conn;
-    tor_assert(linked_dir_conn_base);
+    /* If the linked connection has been unlinked by other code, we can't send
+     * a begin cell on it. */
+    if (!linked_dir_conn_base) {
+      return -1;
+    }
     /* Sensitive directory connections must have an anonymous path length.
      * Otherwise, directory connections are typically one-hop.
      * This matches the earlier check for directory connection path anonymity