浏览代码

Merge remote branch 'mikeperry/bwweight-smartlistfix'

Nick Mathewson 15 年之前
父节点
当前提交
b3ec39af8f
共有 1 个文件被更改,包括 23 次插入0 次删除
  1. 23 0
      src/or/routerlist.c

+ 23 - 0
src/or/routerlist.c

@@ -1574,6 +1574,13 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
              rule == WEIGHT_FOR_MID ||
              rule == WEIGHT_FOR_MID ||
              rule == WEIGHT_FOR_DIR);
              rule == WEIGHT_FOR_DIR);
 
 
+  if (smartlist_len(sl) == 0) {
+    log_info(LD_CIRC,
+             "Empty routerlist passed in to consensus weight node "
+             "selection for rule %d", rule);
+    return NULL;
+  }
+
   weight_scale = networkstatus_get_param(NULL, "bwweightscale",
   weight_scale = networkstatus_get_param(NULL, "bwweightscale",
                                          BW_WEIGHT_SCALE);
                                          BW_WEIGHT_SCALE);
 
 
@@ -1692,6 +1699,15 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
             "Wg=%lf Wm=%lf We=%lf Wd=%lf with total bw %lf", rule,
             "Wg=%lf Wm=%lf We=%lf Wd=%lf with total bw %lf", rule,
             Wg, Wm, We, Wd, weighted_bw);
             Wg, Wm, We, Wd, weighted_bw);
 
 
+  /* If there is no bandwidth, choose at random */
+  if (DBL_TO_U64(weighted_bw) == 0) {
+    log_warn(LD_CIRC,
+             "Weighted bandwidth is %lf in node selection for rule %d",
+             weighted_bw, rule);
+    tor_free(bandwidths);
+    return smartlist_choose(sl);
+  }
+
   rand_bw = crypto_rand_uint64(DBL_TO_U64(weighted_bw));
   rand_bw = crypto_rand_uint64(DBL_TO_U64(weighted_bw));
   rand_bw++; /* crypto_rand_uint64() counts from 0, and we need to count
   rand_bw++; /* crypto_rand_uint64() counts from 0, and we need to count
               * from 1 below. See bug 1203 for details. */
               * from 1 below. See bug 1203 for details. */
@@ -1765,6 +1781,13 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule,
              rule == WEIGHT_FOR_EXIT ||
              rule == WEIGHT_FOR_EXIT ||
              rule == WEIGHT_FOR_GUARD);
              rule == WEIGHT_FOR_GUARD);
 
 
+  if (smartlist_len(sl) == 0) {
+    log_info(LD_CIRC,
+             "Empty routerlist passed in to old node selection for rule %d",
+             rule);
+    return NULL;
+  }
+
   /* First count the total bandwidth weight, and make a list
   /* First count the total bandwidth weight, and make a list
    * of each value.  <0 means "unknown; no routerinfo."  We use the
    * of each value.  <0 means "unknown; no routerinfo."  We use the
    * bits of negative values to remember whether the router was fast (-x)&1
    * bits of negative values to remember whether the router was fast (-x)&1