]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
replace L2 vanguards that aren't Fast or Stable
authorRoger Dingledine <arma@torproject.org>
Wed, 5 Jul 2023 22:39:57 +0000 (18:39 -0400)
committerRoger Dingledine <arma@torproject.org>
Thu, 6 Jul 2023 03:00:38 +0000 (23:00 -0400)
Rotate to a new L2 vanguard whenever an existing one loses the
Stable or Fast flag. Previously, we would leave these relays in the
L2 vanguard list but never use them, and if all of our vanguards
end up like this we wouldn't have any middle nodes left to choose
from so we would fail to make onion-related circuits.

Fixes bug 40805; bugfix on 0.4.7.1-alpha.

changes/bug40805 [new file with mode: 0644]
src/feature/client/entrynodes.c

diff --git a/changes/bug40805 b/changes/bug40805
new file mode 100644 (file)
index 0000000..bed27c5
--- /dev/null
@@ -0,0 +1,7 @@
+  o Major bugfixes (vanguards):
+    - Rotate to a new L2 vanguard whenever an existing one loses the
+      Stable or Fast flag. Previously, we would leave these relays in the
+      L2 vanguard list but never use them, and if all of our vanguards
+      end up like this we wouldn't have any middle nodes left to choose
+      from so we would fail to make onion-related circuits. Fixes bug
+      40805; bugfix on 0.4.7.1-alpha.
index e7324487da4f1328e12c822dfc049cde98dfd3ef..5436b74b9c7a151b10a5acd3706e0b7f4d1e6583 100644 (file)
 #include "feature/nodelist/node_st.h"
 #include "core/or/origin_circuit_st.h"
 #include "app/config/or_state_st.h"
+#include "src/feature/nodelist/routerstatus_st.h"
 
 /** A list of existing guard selection contexts. */
 static smartlist_t *guard_contexts = NULL;
@@ -4115,8 +4116,10 @@ maintain_layer2_guards(void)
     }
 
     /* Expire if relay has left consensus */
-    if (router_get_consensus_status_by_id(g->identity) == NULL) {
-      log_info(LD_GENERAL, "Removing missing Layer2 guard %s",
+    const routerstatus_t *rs = router_get_consensus_status_by_id(g->identity);
+    if (rs == NULL || !rs->is_stable || !rs->is_fast) {
+      log_info(LD_GENERAL, "Removing %s Layer2 guard %s",
+               rs ? "unsuitable" : "missing",
                safe_str_client(hex_str(g->identity, DIGEST_LEN)));
       // Nickname may be gone from consensus and doesn't matter anyway
       control_event_guard("None", g->identity, "BAD_L2");