diff options
author | Mike Perry <mikeperry-git@fscked.org> | 2010-02-26 16:17:09 -0800 |
---|---|---|
committer | Mike Perry <mikeperry-git@fscked.org> | 2010-02-26 16:17:09 -0800 |
commit | 03d6995d0ef689bc9951e603d09939c449d9c159 (patch) | |
tree | 5bf6fcc9a5ccc2daecfa89de7e84955297d1baa2 /src/or/routerlist.c | |
parent | 1c39dbd53a4c47ac3bfd6770d0ca2f8f058f888b (diff) | |
download | tor-03d6995d0ef689bc9951e603d09939c449d9c159.tar.gz tor-03d6995d0ef689bc9951e603d09939c449d9c159.zip |
Check for empty smartlists and no bandwidth during node selection.
Diffstat (limited to 'src/or/routerlist.c')
-rw-r--r-- | src/or/routerlist.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 80229f2141..4daf1e6abd 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -1576,6 +1576,13 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, rule == WEIGHT_FOR_MID || rule == WEIGHT_FOR_DIR); + if (!sl || smartlist_len(sl) == 0) { + log_warn(LD_CIRC, + "Empty routerlist passed in to node selection for rule %d", + rule); + return NULL; + } + weight_scale = networkstatus_get_param(NULL, "bwweightscale", BW_WEIGHT_SCALE); @@ -1694,6 +1701,15 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl, "Wg=%lf Wm=%lf We=%lf Wd=%lf with total bw %lf", rule, 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() counts from 0, and we need to count * from 1 below. See bug 1203 for details. */ @@ -1767,6 +1783,13 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule, rule == WEIGHT_FOR_EXIT || rule == WEIGHT_FOR_GUARD); + if (!sl || smartlist_len(sl) == 0) { + log_warn(LD_CIRC, + "Empty routerlist passed in to node selection for rule %d", + rule); + return NULL; + } + /* First count the total bandwidth weight, and make a list * of each value. <0 means "unknown; no routerinfo." We use the * bits of negative values to remember whether the router was fast (-x)&1 |