From 34d02484c06f26653563176e4b5db2829ae4bc23 Mon Sep 17 00:00:00 2001
From: Nick Mathewson <nickm@torproject.org>
Date: Tue, 16 Jul 2013 13:59:31 -0400
Subject: [PATCH] Fix hash functions for transport_name in client entry

---
 src/or/geoip.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/or/geoip.c b/src/or/geoip.c
index b4f54d4eb2..21dceed3da 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -486,23 +486,16 @@ static HT_HEAD(clientmap, clientmap_entry_t) client_history =
 static INLINE unsigned
 clientmap_entry_hash(const clientmap_entry_t *a)
 {
-  return ht_improve_hash(tor_addr_hash(&a->addr));
+  unsigned h = tor_addr_hash(&a->addr);
+  if (a->transport_name)
+    h += ht_string_hash(a->transport_name);
+  return ht_improve_hash(h);
 }
 /** Hashtable helper: compare two clientmap_entry_t values for equality. */
 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))
+  if (strcmp_opt(a->transport_name, b->transport_name))
     return 0;
 
   return !tor_addr_compare(&a->addr, &b->addr, CMP_EXACT) &&
-- 
GitLab