ソースを参照

Merge remote-tracking branch 'teor/bug23524'

Nick Mathewson 6 年 前
コミット
72391fce23
3 ファイル変更11 行追加4 行削除
  1. 4 0
      changes/bug23524
  2. 6 3
      src/or/bridges.c
  3. 1 1
      src/or/directory.c

+ 4 - 0
changes/bug23524

@@ -0,0 +1,4 @@
+  o Minor bugfixes (DoS-resistance):
+    - If future code asks if there are any running bridges, without checking
+      if bridges are enabled, log a BUG warning rather than crashing.
+      Fixes 23524 on 0.3.0.1-alpha.

+ 6 - 3
src/or/bridges.c

@@ -455,8 +455,8 @@ bridge_add_from_config(bridge_line_t *bridge_line)
   b->fetch_status.schedule = DL_SCHED_BRIDGE;
   b->fetch_status.backoff = DL_SCHED_RANDOM_EXPONENTIAL;
   b->fetch_status.increment_on = DL_SCHED_INCREMENT_ATTEMPT;
-  /* This will fail if UseBridges is not set -- and it does. */
-  // download_status_reset(&b->fetch_status);
+  /* We can't reset the bridge's download status here, because UseBridges
+   * might be 0 now, and it might be changed to 1 much later. */
   b->socks_args = bridge_line->socks_args;
   if (!bridge_list)
     bridge_list = smartlist_new();
@@ -625,6 +625,7 @@ fetch_bridge_descriptors(const or_options_t *options, time_t now)
 
   SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge)
     {
+      /* This resets the download status on first use */
       if (!download_status_is_ready(&bridge->fetch_status, now,
                                     IMPOSSIBLE_TO_DOWNLOAD))
         continue; /* don't bother, no need to retry yet */
@@ -835,7 +836,9 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
 MOCK_IMPL(int,
 any_bridge_descriptors_known, (void))
 {
-  tor_assert(get_options()->UseBridges);
+  if (BUG(!get_options()->UseBridges)) {
+    return 0;
+  }
 
   if (!bridge_list)
     return 0;

+ 1 - 1
src/or/directory.c

@@ -5379,7 +5379,7 @@ find_dl_schedule(const download_status_t *dls, const or_options_t *options)
       }
     case DL_SCHED_BRIDGE:
       /* A bridge client downloading bridge descriptors */
-      if (any_bridge_descriptors_known()) {
+      if (options->UseBridges && any_bridge_descriptors_known()) {
         /* A bridge client with one or more running bridges */
         return options->TestingBridgeDownloadSchedule;
       } else {