summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug406395
-rw-r--r--src/feature/client/entrynodes.c16
2 files changed, 18 insertions, 3 deletions
diff --git a/changes/bug40639 b/changes/bug40639
new file mode 100644
index 0000000000..d975e9ad22
--- /dev/null
+++ b/changes/bug40639
@@ -0,0 +1,5 @@
+ o Major bugfixes (vanguards):
+ - We had omitted some checks for whether our vanguards (second layer
+ guards from proposal 333) overlapped. Now make sure to pick each
+ of them to be independent. Also, change the design to allow them to
+ come from the same family. Fixes bug 40639; bugfix on 0.4.7.1-alpha.
diff --git a/src/feature/client/entrynodes.c b/src/feature/client/entrynodes.c
index 15f29d1c3e..e7324487da 100644
--- a/src/feature/client/entrynodes.c
+++ b/src/feature/client/entrynodes.c
@@ -4136,8 +4136,17 @@ maintain_layer2_guards(void)
log_info(LD_GENERAL, "Adding %d guards to Layer2 routerset",
new_guards_needed_n);
- /* Add required guards to the list */
+ /* First gather the exclusions based on our current L2 guards */
smartlist_t *excluded = smartlist_new();
+ SMARTLIST_FOREACH_BEGIN(layer2_guards, layer2_guard_t *, g) {
+ /* Exclude existing L2 guard so that we don't double-pick it.
+ * But, it's ok if they come from the same family. */
+ const node_t *existing = node_get_by_id(g->identity);
+ if (existing)
+ smartlist_add(excluded, (node_t *)existing);
+ } SMARTLIST_FOREACH_END(g);
+
+ /* Add required guards to the list */
for (int i = 0; i < new_guards_needed_n; i++) {
const node_t *choice = NULL;
const or_options_t *options = get_options();
@@ -4159,8 +4168,9 @@ maintain_layer2_guards(void)
// Nickname can also be None here because it is looked up later
control_event_guard("None", layer2_guard->identity,
"GOOD_L2");
- /* Exclude this node and its family so that we don't double-pick. */
- nodelist_add_node_and_family(excluded, choice);
+ /* Exclude this node so that we don't double-pick it. (Again, coming
+ * from the same family is ok here.) */
+ smartlist_add(excluded, (node_t *)choice);
}
/* Some cleanup */