aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-03-01 08:51:10 -0500
committerNick Mathewson <nickm@torproject.org>2017-03-01 08:51:10 -0500
commit26997ef9ae4591c06f5916fdfdd216d01333e878 (patch)
treefe22a84ab6163740d96ee00c2b80923a219e0f1b
parent23d365f3ae4dc54df38852f1d7f6579fc9897cef (diff)
parent18a98206ede334c7332c43dc9f0b812611273f37 (diff)
downloadtor-26997ef9ae4591c06f5916fdfdd216d01333e878.tar.gz
tor-26997ef9ae4591c06f5916fdfdd216d01333e878.zip
Merge branch 'maint-0.3.0' into release-0.3.0
-rw-r--r--changes/bug214154
-rw-r--r--src/or/entrynodes.c12
2 files changed, 13 insertions, 3 deletions
diff --git a/changes/bug21415 b/changes/bug21415
new file mode 100644
index 0000000000..f0aa72f81f
--- /dev/null
+++ b/changes/bug21415
@@ -0,0 +1,4 @@
+ o Minor bugfix (entry guards):
+ - Silence a BUG() warning when attempting to use a guard whose descriptor
+ we don't know and make this scenario more unlikely to happen. Fixes bug
+ 21415; bugfix on 0.3.0.1-alpha.
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index 3e871477b4..729e4b0391 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -1843,7 +1843,7 @@ select_entry_guard_for_circuit(guard_selection_t *gs,
if (! entry_guard_obeys_restriction(guard, rst))
continue;
if (guard->is_reachable != GUARD_REACHABLE_NO) {
- if (need_descriptor && BUG(!guard_has_descriptor(guard))) {
+ if (need_descriptor && !guard_has_descriptor(guard)) {
continue;
}
*state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
@@ -3357,9 +3357,15 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs)
if (!gs->primary_guards_up_to_date)
entry_guards_update_primary(gs);
- const int num_primary = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
int n_missing_descriptors = 0;
int n_considered = 0;
+ int num_primary_to_check;
+
+ /* We want to check for the descriptor of at least the first two primary
+ * guards in our list, since these are the guards that we typically use for
+ * circuits. */
+ num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
+ num_primary_to_check++;
SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
entry_guard_consider_retry(guard);
@@ -3368,7 +3374,7 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs)
n_considered++;
if (!guard_has_descriptor(guard))
n_missing_descriptors++;
- if (n_considered >= num_primary)
+ if (n_considered >= num_primary_to_check)
break;
} SMARTLIST_FOREACH_END(guard);