Browse Source

don't div by 0 during path selection

Roger Dingledine 15 years ago
parent
commit
8cba62cc2a
2 changed files with 7 additions and 3 deletions
  1. 5 1
      ChangeLog
  2. 2 2
      src/or/routerlist.c

+ 5 - 1
ChangeLog

@@ -1,4 +1,4 @@
-Changes in version 0.2.2.7-alpha - 2009-12-??
+Changes in version 0.2.2.7-alpha - 2010-01-??
   o Major features (performance):
   o Major features (performance):
     - When choosing which cells to relay first, we can now favor circuits
     - When choosing which cells to relay first, we can now favor circuits
       that have been quiet recently, so as to get lower latency for
       that have been quiet recently, so as to get lower latency for
@@ -67,6 +67,10 @@ Changes in version 0.2.2.7-alpha - 2009-12-??
     - Fix statistics on client numbers by country as seen by bridges that
     - Fix statistics on client numbers by country as seen by bridges that
       were broken in 0.2.2.1-alpha. Also switch to reporting full 24-hour
       were broken in 0.2.2.1-alpha. Also switch to reporting full 24-hour
       intervals instead of variable 12-to-48-hour intervals.
       intervals instead of variable 12-to-48-hour intervals.
+    - If we're in the pathological case where there's no exit bandwidth
+      but there is non-exit bandwidth, or no guard bandwidth but there
+      is non-guard bandwidth, don't crash during path selection. Bugfix
+      on 0.2.0.3-alpha.
 
 
   o Removed features:
   o Removed features:
     - Remove the HSAuthorityRecordStats option that version 0 hidden
     - Remove the HSAuthorityRecordStats option that version 0 hidden

+ 2 - 2
src/or/routerlist.c

@@ -1698,12 +1698,12 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule,
      * For detailed derivation of this formula, see
      * For detailed derivation of this formula, see
      *   http://archives.seul.org/or/dev/Jul-2007/msg00056.html
      *   http://archives.seul.org/or/dev/Jul-2007/msg00056.html
      */
      */
-    if (rule == WEIGHT_FOR_EXIT)
+    if (rule == WEIGHT_FOR_EXIT || !total_exit_bw)
       exit_weight = 1.0;
       exit_weight = 1.0;
     else
     else
       exit_weight = 1.0 - all_bw/(3.0*exit_bw);
       exit_weight = 1.0 - all_bw/(3.0*exit_bw);
 
 
-    if (rule == WEIGHT_FOR_GUARD)
+    if (rule == WEIGHT_FOR_GUARD || !total_guard_bw)
       guard_weight = 1.0;
       guard_weight = 1.0;
     else
     else
       guard_weight = 1.0 - all_bw/(3.0*guard_bw);
       guard_weight = 1.0 - all_bw/(3.0*guard_bw);