mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 12:23:32 +01:00
Merge remote branch 'origin/maint-0.2.2'
This commit is contained in:
commit
d39e46c26d
9
changes/bug1912
Normal file
9
changes/bug1912
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
o Major bugfixes:
|
||||||
|
- When weighting bridges, we used to trust the bandwidths they provided
|
||||||
|
in their descriptor, only capping them at 10MB/s. This turned out to be
|
||||||
|
problematic for two reasons: Bridges could claim to handle a lot more
|
||||||
|
traffic then they actually would, thus making more clients pick them and
|
||||||
|
have a pretty effective DoS attack. The other issue is that new bridges
|
||||||
|
that might not have a good estimate for their bw capacity yet would not
|
||||||
|
get used at all unless no other bridges are available to a client.
|
||||||
|
This fixes bug 1912; bugfix on 0.2.2.7-alpha.
|
@ -2877,3 +2877,4 @@ load_windows_system_library(const TCHAR *library_name)
|
|||||||
return LoadLibrary(path);
|
return LoadLibrary(path);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1579,6 +1579,29 @@ router_get_advertised_bandwidth_capped(routerinfo_t *router)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** When weighting bridges, enforce these values as lower and upper
|
||||||
|
* bound for believable bandwidth, because there is no way for us
|
||||||
|
* to verify a bridge's bandwidth currently. */
|
||||||
|
#define BRIDGE_MIN_BELIEVABLE_BANDWIDTH 20000 /* 20 kB/sec */
|
||||||
|
#define BRIDGE_MAX_BELIEVABLE_BANDWIDTH 100000 /* 100 kB/sec */
|
||||||
|
|
||||||
|
/** Return the smaller of the router's configured BandwidthRate
|
||||||
|
* and its advertised capacity, making sure to stay within the
|
||||||
|
* interval between bridge-min-believe-bw and
|
||||||
|
* bridge-max-believe-bw. */
|
||||||
|
static uint32_t
|
||||||
|
bridge_get_advertised_bandwidth_bounded(routerinfo_t *router)
|
||||||
|
{
|
||||||
|
uint32_t result = router->bandwidthcapacity;
|
||||||
|
if (result > router->bandwidthrate)
|
||||||
|
result = router->bandwidthrate;
|
||||||
|
if (result > BRIDGE_MAX_BELIEVABLE_BANDWIDTH)
|
||||||
|
result = BRIDGE_MAX_BELIEVABLE_BANDWIDTH;
|
||||||
|
else if (result < BRIDGE_MIN_BELIEVABLE_BANDWIDTH)
|
||||||
|
result = BRIDGE_MIN_BELIEVABLE_BANDWIDTH;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return bw*1000, unless bw*1000 would overflow, in which case return
|
/** Return bw*1000, unless bw*1000 would overflow, in which case return
|
||||||
* INT32_MAX. */
|
* INT32_MAX. */
|
||||||
static INLINE int32_t
|
static INLINE int32_t
|
||||||
@ -1733,7 +1756,7 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
|
|||||||
if (rs && rs->has_bandwidth) {
|
if (rs && rs->has_bandwidth) {
|
||||||
this_bw = kb_to_bytes(rs->bandwidth);
|
this_bw = kb_to_bytes(rs->bandwidth);
|
||||||
} else { /* bridge or other descriptor not in our consensus */
|
} else { /* bridge or other descriptor not in our consensus */
|
||||||
this_bw = router_get_advertised_bandwidth_capped(router);
|
this_bw = bridge_get_advertised_bandwidth_bounded(router);
|
||||||
have_unknown = 1;
|
have_unknown = 1;
|
||||||
}
|
}
|
||||||
if (router_digest_is_me(router->cache_info.identity_digest))
|
if (router_digest_is_me(router->cache_info.identity_digest))
|
||||||
@ -1904,7 +1927,7 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule,
|
|||||||
flags |= is_exit ? 2 : 0;
|
flags |= is_exit ? 2 : 0;
|
||||||
flags |= is_guard ? 4 : 0;
|
flags |= is_guard ? 4 : 0;
|
||||||
} else /* bridge or other descriptor not in our consensus */
|
} else /* bridge or other descriptor not in our consensus */
|
||||||
this_bw = router_get_advertised_bandwidth_capped(router);
|
this_bw = bridge_get_advertised_bandwidth_bounded(router);
|
||||||
}
|
}
|
||||||
if (is_exit)
|
if (is_exit)
|
||||||
bitarray_set(exit_bits, i);
|
bitarray_set(exit_bits, i);
|
||||||
@ -1912,6 +1935,8 @@ smartlist_choose_by_bandwidth(smartlist_t *sl, bandwidth_weight_rule_t rule,
|
|||||||
bitarray_set(guard_bits, i);
|
bitarray_set(guard_bits, i);
|
||||||
if (is_known) {
|
if (is_known) {
|
||||||
bandwidths[i] = (int32_t) this_bw; // safe since MAX_BELIEVABLE<INT32_MAX
|
bandwidths[i] = (int32_t) this_bw; // safe since MAX_BELIEVABLE<INT32_MAX
|
||||||
|
// XXX this is no longer true! We don't always cap the bw anymore. Can
|
||||||
|
// a consensus make us overflow?-sh
|
||||||
tor_assert(bandwidths[i] >= 0);
|
tor_assert(bandwidths[i] >= 0);
|
||||||
if (is_guard)
|
if (is_guard)
|
||||||
total_guard_bw += this_bw;
|
total_guard_bw += this_bw;
|
||||||
|
Loading…
Reference in New Issue
Block a user