From 6ede110c4de344ee4c51e730a054ff624ea1de75 Mon Sep 17 00:00:00 2001
From: Roger Dingledine <arma@torproject.org>
Date: Tue, 22 May 2007 01:01:24 +0000
Subject: When choosing an entry guard for our circuit, avoid using guards that
 are in the same family as the chosen exit -- not just guards that are exactly
 the chosen exit. (Reported by lodger.)

svn:r10240
---
 ChangeLog             | 3 +++
 src/or/circuitbuild.c | 6 +++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index bbb58ca6c..543337176 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -156,6 +156,9 @@ Changes in version 0.2.0.1-alpha - 2007-??-??
     - Make the NodeFamilies config option work. (Reported by
       lodger -- it has never actually worked, even though we added it
       in Oct 2004.)
+    - When choosing an entry guard for our circuit, avoid using guards
+      that are in the same family as the chosen exit -- not just guards
+      that are exactly the chosen exit. (Reported by lodger.)
 
   o Minor bugfixes (controller):
     - Make 'getinfo fingerprint' return a 551 error if we're not a
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 24a8f0c72..fda3b85ec 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -2339,11 +2339,14 @@ choose_random_entry(cpath_build_state_t *state)
 {
   or_options_t *options = get_options();
   smartlist_t *live_entry_guards = smartlist_create();
+  smartlist_t *exit_family = smartlist_create();
   routerinfo_t *chosen_exit = build_state_get_exit_router(state);
   routerinfo_t *r = NULL;
   int need_uptime = state->need_uptime;
   int need_capacity = state->need_capacity;
 
+  routerlist_add_family(exit_family, chosen_exit);
+
   if (!entry_guards)
     entry_guards = smartlist_create();
 
@@ -2360,7 +2363,7 @@ choose_random_entry(cpath_build_state_t *state)
   SMARTLIST_FOREACH(entry_guards, entry_guard_t *, entry,
     {
       r = entry_is_live(entry, need_uptime, need_capacity, 0);
-      if (r && r != chosen_exit) {
+      if (r && !smartlist_isin(exit_family, r)) {
         smartlist_add(live_entry_guards, r);
         if (smartlist_len(live_entry_guards) >= options->NumEntryGuards)
           break; /* we have enough */
@@ -2397,6 +2400,7 @@ choose_random_entry(cpath_build_state_t *state)
 
   r = smartlist_choose(live_entry_guards);
   smartlist_free(live_entry_guards);
+  smartlist_free(exit_family);
   return r;
 }
 
-- 
cgit v1.2.3