[tor-commits] [tor/main] don't retry entry guards if they're bridges without descriptors

ahf at torproject.org ahf at torproject.org
Tue Nov 2 15:29:12 UTC 2021


commit 7084ec871070e1f01a48b7735367b94abe1feb21
Author: Roger Dingledine <arma at torproject.org>
Date:   Sat Oct 23 20:32:36 2021 -0400

    don't retry entry guards if they're bridges without descriptors
    
    When we don't yet have a descriptor for one of our bridges, disable
    the entry guard retry schedule on that bridge. The entry guard retry
    schedule and the bridge descriptor retry schedule can conflict,
    e.g. where we mark a bridge as "maybe up" yet we don't try to fetch
    its descriptor yet, leading Tor to wait (refusing to do anything)
    until it becomes time to fetch the descriptor.
    
    Fixes bug 40497; bugfix on 0.3.0.3-alpha.
---
 changes/bug40497                | 8 ++++++++
 src/feature/client/entrynodes.c | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/changes/bug40497 b/changes/bug40497
new file mode 100644
index 0000000000..d3004d0b72
--- /dev/null
+++ b/changes/bug40497
@@ -0,0 +1,8 @@
+  o Minor bugfixes (bridges):
+    - When we don't yet have a descriptor for one of our bridges, disable
+      the entry guard retry schedule on that bridge. The entry guard retry
+      schedule and the bridge descriptor retry schedule can conflict,
+      e.g. where we mark a bridge as "maybe up" yet we don't try to fetch
+      its descriptor yet, leading Tor to wait (refusing to do anything)
+      until it becomes time to fetch the descriptor. Fixes bug 40497;
+      bugfix on 0.3.0.3-alpha.
diff --git a/src/feature/client/entrynodes.c b/src/feature/client/entrynodes.c
index a05ec63512..32ecb4f705 100644
--- a/src/feature/client/entrynodes.c
+++ b/src/feature/client/entrynodes.c
@@ -2059,6 +2059,14 @@ entry_guard_consider_retry(entry_guard_t *guard)
     get_retry_schedule(guard->failing_since, now, guard->is_primary);
   const time_t last_attempt = guard->last_tried_to_connect;
 
+  /* Check if it is a bridge and we don't have its descriptor yet */
+  if (guard->bridge_addr && !guard_has_descriptor(guard)) {
+    /* We want to leave the retry schedule to fetch_bridge_descriptors(),
+     * so we don't have two retry schedules clobbering each other. See
+     * bugs 40396 and 40497 for details of why we need this exception. */
+    return;
+  }
+
   if (BUG(last_attempt == 0) ||
       now >= last_attempt + delay) {
     /* We should mark this retriable. */





More information about the tor-commits mailing list