diff options
author | Nick Mathewson <nickm@torproject.org> | 2012-08-09 12:37:40 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-08-09 12:40:03 -0400 |
commit | 640a51684ce5a6cdae5c5f92cd2f932922380c00 (patch) | |
tree | 0cfaffe7e783cc8fb1b26d8da07a44067d2d04fc /src/or | |
parent | e106812a778f53760c819ab20a214ac3222b3b15 (diff) | |
download | tor-640a51684ce5a6cdae5c5f92cd2f932922380c00.tar tor-640a51684ce5a6cdae5c5f92cd2f932922380c00.tar.gz |
Remove remaining timing-dependency in choosing nodes by bandwidth
The old approach, because of its "tmp >= rand_bw &&
!i_has_been_chosen" check, would run through the second part of the
loop slightly slower than the first part. Now, we remove
i_has_been_chosen, and instead set rand_bw = UINT64_MAX, so that
every instance of the loop will do exactly the same amount of work
regardless of the initial value of rand_bw.
Fix for bug 6538.
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/routerlist.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 382d45746..75cb3f2e6 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -1710,7 +1710,6 @@ smartlist_choose_node_by_bandwidth_weights(smartlist_t *sl, uint64_t tmp; unsigned int i; unsigned int i_chosen; - unsigned int i_has_been_chosen; int have_unknown = 0; /* true iff sl contains element not in consensus. */ /* Can't choose exit and guard at same time */ @@ -1881,13 +1880,12 @@ smartlist_choose_node_by_bandwidth_weights(smartlist_t *sl, /* Last, count through sl until we get to the element we picked */ i_chosen = (unsigned)smartlist_len(sl); - i_has_been_chosen = 0; tmp = 0; for (i=0; i < (unsigned)smartlist_len(sl); i++) { tmp += bandwidths[i]; - if (tmp >= rand_bw && !i_has_been_chosen) { + if (tmp >= rand_bw) { i_chosen = i; - i_has_been_chosen = 1; + rand_bw = UINT64_MAX; } } i = i_chosen; @@ -1926,7 +1924,6 @@ smartlist_choose_node_by_bandwidth(smartlist_t *sl, { unsigned int i; unsigned int i_chosen; - unsigned int i_has_been_chosen; int32_t *bandwidths; int is_exit; int is_guard; @@ -2127,7 +2124,6 @@ smartlist_choose_node_by_bandwidth(smartlist_t *sl, /* Last, count through sl until we get to the element we picked */ tmp = 0; i_chosen = (unsigned)smartlist_len(sl); - i_has_been_chosen = 0; for (i=0; i < (unsigned)smartlist_len(sl); i++) { is_exit = bitarray_is_set(exit_bits, i); is_guard = bitarray_is_set(guard_bits, i); @@ -2142,9 +2138,9 @@ smartlist_choose_node_by_bandwidth(smartlist_t *sl, else tmp += bandwidths[i]; - if (tmp >= rand_bw && !i_has_been_chosen) { + if (tmp >= rand_bw) { i_chosen = i; - i_has_been_chosen = 1; + rand_bw = UINT64_MAX; } } i = i_chosen; |