[tor-commits] [tor/master] If a single client connects with multiple transports, note all transports.

nickm at torproject.org nickm at torproject.org
Thu Aug 15 16:16:46 UTC 2013


commit 6ad535e6dca8e9e284a0fa3384679756dca34a87
Author: George Kadianakis <desnacked at riseup.net>
Date:   Thu Jun 27 18:27:44 2013 +0300

    If a single client connects with multiple transports, note all transports.
---
 src/or/geoip.c  |   19 +++++++++++++++++++
 src/test/test.c |    7 ++++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/or/geoip.c b/src/or/geoip.c
index 737512f..866f6a7 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -492,6 +492,19 @@ clientmap_entry_hash(const clientmap_entry_t *a)
 static INLINE int
 clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
 {
+  /* If one entry contains a transport and the other doesn't, then
+     they are not equal. */
+  if (a->transport_name && !b->transport_name)
+    return 0;
+  if (!a->transport_name && b->transport_name)
+    return 0;
+  /* If entries contain different transports, they they are not
+     equal. */
+  if (a->transport_name &&
+      b->transport_name &&
+      strcmp(a->transport_name, b->transport_name))
+    return 0;
+
   return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
          a->action == b->action;
 }
@@ -529,6 +542,8 @@ geoip_note_client_seen(geoip_client_action_t action,
 {
   const or_options_t *options = get_options();
   clientmap_entry_t lookup, *ent;
+  memset(&lookup, 0, sizeof(clientmap_entry_t));
+
   if (action == GEOIP_CLIENT_CONNECT) {
     /* Only remember statistics as entry guard or as bridge. */
     if (!options->EntryStatistics &&
@@ -546,7 +561,11 @@ geoip_note_client_seen(geoip_client_action_t action,
 
   tor_addr_copy(&lookup.addr, addr);
   lookup.action = (int)action;
+  if (transport_name)
+    lookup.transport_name = tor_strdup(transport_name);
   ent = HT_FIND(clientmap, &client_history, &lookup);
+  tor_free(lookup.transport_name);
+
   if (! ent) {
     ent = tor_malloc_zero(sizeof(clientmap_entry_t));
     tor_addr_copy(&ent->addr, addr);
diff --git a/src/test/test.c b/src/test/test.c
index 822f93a..e0c6772 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -1944,10 +1944,15 @@ test_geoip_with_pt(void)
     geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "entropy", now-7200);
   }
 
+  /* 2 connections from the same IP with two different transports. */
+  SET_TEST_ADDRESS(++i);
+  geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "fire", now-7200);
+  geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, "google", now-7200);
+
   /* Test the transport history string. */
   s = geoip_get_transport_history();
   tor_assert(s);
-  test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,entropy=8");
+  test_streq(s, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,entropy=8,fire=8,google=8");
 
   /* Stop collecting entry statistics. */
   geoip_entry_stats_term();





More information about the tor-commits mailing list