[tor-commits] [tor/master] Raise the TrackHostExits membership code into its own function

nickm at torproject.org nickm at torproject.org
Sun May 15 15:43:56 UTC 2011


commit ec81d17d0c03d73f4d4acd9102893113b2883d76
Author: Nick Mathewson <nickm at torproject.org>
Date:   Fri May 13 16:22:10 2011 -0400

    Raise the TrackHostExits membership code into its own function
---
 src/or/circuituse.c |   35 ++++++++++++++++++++++-------------
 src/or/circuituse.h |    2 ++
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index e68fb4f..6e069b1 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -1485,12 +1485,31 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ,
   }
 }
 
+/** Return true iff <b>address</b> is matched by one of the entries in
+ * TrackHostExits. */
+int
+hostname_in_track_host_exits(or_options_t *options, const char *address)
+{
+  if (!options->TrackHostExits)
+    return 0;
+  SMARTLIST_FOREACH_BEGIN(options->TrackHostExits, const char *, cp) {
+    if (cp[0] == '.') { /* match end */
+      if (cp[1] == '\0' ||
+          !strcasecmpend(address, cp) ||
+          !strcasecmp(address, &cp[1]))
+        return 1;
+    } else if (strcasecmp(cp, address) == 0) {
+      return 1;
+    }
+  } SMARTLIST_FOREACH_END(cp);
+  return 0;
+}
+
 /** If an exit wasn't specifically chosen, save the history for future
  * use. */
 static void
 consider_recording_trackhost(edge_connection_t *conn, origin_circuit_t *circ)
 {
-  int found_needle = 0;
   or_options_t *options = get_options();
   size_t len;
   char *new_address;
@@ -1503,18 +1522,8 @@ consider_recording_trackhost(edge_connection_t *conn, origin_circuit_t *circ)
                               options->TrackHostExitsExpire))
     return; /* nothing to track, or already mapped */
 
-  SMARTLIST_FOREACH(options->TrackHostExits, const char *, cp, {
-    if (cp[0] == '.') { /* match end */
-      if (cp[1] == '\0' ||
-          !strcasecmpend(conn->socks_request->address, cp) ||
-          !strcasecmp(conn->socks_request->address, &cp[1]))
-          found_needle = 1;
-    } else if (strcasecmp(cp, conn->socks_request->address) == 0) {
-      found_needle = 1;
-    }
-  });
-
-  if (!found_needle || !circ->build_state->chosen_exit)
+  if (!hostname_in_track_host_exits(options, conn->socks_request->address) ||
+      !circ->build_state->chosen_exit)
     return;
 
   /* write down the fingerprint of the chosen exit, not the nickname,
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index 9f393ab..bfeaea2 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -51,5 +51,7 @@ int connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn,
                                                   crypt_path_t *cpath);
 int connection_ap_handshake_attach_circuit(edge_connection_t *conn);
 
+int hostname_in_track_host_exits(or_options_t *options, const char *address);
+
 #endif
 





More information about the tor-commits mailing list