Просмотр исходного кода

Fix a crash when we load a bridge descriptor from disk but we don't
currently have a Bridge line for it in our torrc. Bugfix on
0.2.0.12-alpha.


svn:r12921

Roger Dingledine 18 лет назад
Родитель
Сommit
6097e46420
3 измененных файлов с 14 добавлено и 8 удалено
  1. 3 0
      ChangeLog
  2. 9 6
      src/or/circuitbuild.c
  3. 2 2
      src/or/routerlist.c

+ 3 - 0
ChangeLog

@@ -8,6 +8,9 @@ Changes in version 0.2.0.14-alpha - 2007-12-??
       time you use a given introduction point for your service, but
       time you use a given introduction point for your service, but
       on subsequent requests we'd be using garbage memory. Fixed by
       on subsequent requests we'd be using garbage memory. Fixed by
       Karsten Loesing. Bugfix on 0.2.0.12-alpha.
       Karsten Loesing. Bugfix on 0.2.0.12-alpha.
+    - Fix a crash when we load a bridge descriptor from disk but we don't
+      currently have a Bridge line for it in our torrc. Bugfix on
+      0.2.0.12-alpha.
 
 
   o Minor bugfixes:
   o Minor bugfixes:
     - Make the unit tests build again.
     - Make the unit tests build again.

+ 9 - 6
src/or/circuitbuild.c

@@ -2908,6 +2908,7 @@ bridge_fetch_status_increment(bridge_info_t *bridge, time_t now)
 static void
 static void
 bridge_fetch_status_arrived(bridge_info_t *bridge, time_t now)
 bridge_fetch_status_arrived(bridge_info_t *bridge, time_t now)
 {
 {
+  tor_assert(bridge);
   bridge->fetch_status.next_attempt_at = now+60*60;
   bridge->fetch_status.next_attempt_at = now+60*60;
   bridge->fetch_status.n_download_failures = 0;
   bridge->fetch_status.n_download_failures = 0;
 }
 }
@@ -3038,13 +3039,15 @@ learned_bridge_descriptor(routerinfo_t *ri)
     time_t now = time(NULL);
     time_t now = time(NULL);
     ri->is_running = 1;
     ri->is_running = 1;
 
 
-    /* it's here; schedule its re-fetch for a long time from now. */
-    bridge_fetch_status_arrived(bridge, now);
+    if (bridge) { /* if we actually want to use this one */
+      /* it's here; schedule its re-fetch for a long time from now. */
+      bridge_fetch_status_arrived(bridge, now);
 
 
-    add_an_entry_guard(ri, 1);
-    log_notice(LD_DIR, "new bridge descriptor '%s'", ri->nickname);
-    if (first)
-      routerlist_retry_directory_downloads(now);
+      add_an_entry_guard(ri, 1);
+      log_notice(LD_DIR, "new bridge descriptor '%s'", ri->nickname);
+      if (first)
+        routerlist_retry_directory_downloads(now);
+    }
   }
   }
 }
 }
 
 

+ 2 - 2
src/or/routerlist.c

@@ -3050,8 +3050,8 @@ routerlist_remove_old_routers(void)
   digestmap_free(retain, NULL);
   digestmap_free(retain, NULL);
 }
 }
 
 
-/** We just added a new descriptor that isn't of purpose
- * ROUTER_PURPOSE_GENERAL. Take whatever extra steps we need. */
+/** We just added a new set of descriptors. Take whatever extra steps
+ * we need. */
 static void
 static void
 routerlist_descriptors_added(smartlist_t *sl)
 routerlist_descriptors_added(smartlist_t *sl)
 {
 {