aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug22036
-rw-r--r--doc/spec/dir-spec.txt5
-rw-r--r--src/or/dirvote.c11
-rw-r--r--src/or/routerlist.c4
4 files changed, 22 insertions, 4 deletions
diff --git a/changes/bug2203 b/changes/bug2203
new file mode 100644
index 0000000000..9cfbedf148
--- /dev/null
+++ b/changes/bug2203
@@ -0,0 +1,6 @@
+ o Minor bugfixes:
+ - Clients should not weight BadExit nodes as Exits in their node
+ selection. Similarly, directory authorities should not count
+ BadExit bandwidth as Exit bandwidth when computing bandwidth-weights.
+ Bugfix on 0.2.2.10-alpha; fixes bug 2203.
+
diff --git a/doc/spec/dir-spec.txt b/doc/spec/dir-spec.txt
index eebceeafd6..c843a7c41f 100644
--- a/doc/spec/dir-spec.txt
+++ b/doc/spec/dir-spec.txt
@@ -1618,6 +1618,11 @@
* If consensus-method 7 or later is in use, the params line is
included in the output.
+ * If the consensus method is under 11, bad exits are considered as
+ possible exits when computing bandwidth weights. Otherwise, if
+ method 11 or later is in use, any router that is determined to get
+ the BadExit flag doesn't count when we're calculating weights.
+
The signatures at the end of a consensus document are sorted in
ascending order by identity digest.
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 41985d1485..529b45c7d5 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -50,7 +50,7 @@ static int dirvote_publish_consensus(void);
static char *make_consensus_method_list(int low, int high, const char *sep);
/** The highest consensus method that we currently support. */
-#define MAX_SUPPORTED_CONSENSUS_METHOD 10
+#define MAX_SUPPORTED_CONSENSUS_METHOD 11
/** Lowest consensus method that contains a 'directory-footer' marker */
#define MIN_METHOD_FOR_FOOTER 9
@@ -1693,7 +1693,7 @@ networkstatus_compute_consensus(smartlist_t *votes,
const char *chosen_name = NULL;
int exitsummary_disagreement = 0;
int is_named = 0, is_unnamed = 0, is_running = 0;
- int is_guard = 0, is_exit = 0;
+ int is_guard = 0, is_exit = 0, is_bad_exit = 0;
int naming_conflict = 0;
int n_listing = 0;
int i;
@@ -1819,6 +1819,8 @@ networkstatus_compute_consensus(smartlist_t *votes,
is_guard = 1;
else if (!strcmp(fl, "Running"))
is_running = 1;
+ else if (!strcmp(fl, "BadExit"))
+ is_bad_exit = 1;
}
}
});
@@ -1845,6 +1847,11 @@ networkstatus_compute_consensus(smartlist_t *votes,
rs_out.bandwidth = median_uint32(bandwidths, num_bandwidths);
}
+ /* Fix bug 2203: Do not count BadExit nodes as Exits for bw weights */
+ if (consensus_method >= 11) {
+ is_exit = is_exit && !is_bad_exit;
+ }
+
if (consensus_method >= MIN_METHOD_FOR_BW_WEIGHTS) {
if (rs_out.has_bandwidth) {
T += rs_out.bandwidth;
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 47caebf8df..6d6386292f 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -1722,7 +1722,7 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
double weight = 1;
if (statuses) {
routerstatus_t *status = smartlist_get(sl, i);
- is_exit = status->is_exit;
+ is_exit = status->is_exit && !status->is_bad_exit;
is_guard = status->is_possible_guard;
is_dir = (status->dir_port != 0);
if (!status->has_bandwidth) {
@@ -1742,7 +1742,7 @@ smartlist_choose_by_bandwidth_weights(smartlist_t *sl,
routerinfo_t *router = smartlist_get(sl, i);
rs = router_get_consensus_status_by_id(
router->cache_info.identity_digest);
- is_exit = router->is_exit;
+ is_exit = router->is_exit && !router->is_bad_exit;
is_guard = router->is_possible_guard;
is_dir = (router->dir_port != 0);
if (rs && rs->has_bandwidth) {