[or-cvs] r8578: Move is_local_IP to config.c; have it check for same-/24; ma (in tor/trunk: . src/common src/or)

nickm at seul.org nickm at seul.org
Mon Oct 2 21:00:40 UTC 2006


Author: nickm
Date: 2006-10-02 17:00:35 -0400 (Mon, 02 Oct 2006)
New Revision: 8578

Modified:
   tor/trunk/
   tor/trunk/ChangeLog
   tor/trunk/src/common/util.c
   tor/trunk/src/common/util.h
   tor/trunk/src/or/config.c
   tor/trunk/src/or/connection.c
   tor/trunk/src/or/or.h
Log:
 r8846 at totoro:  nickm | 2006-10-02 16:59:57 -0400
 Move is_local_IP to config.c; have it check for same-/24; make it used only for reachability (not for banwidth, because that is probably not what we want). Fixes an XXX.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r8846] on 96637b51-b116-0410-a10e-9941ebb49b64

Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/ChangeLog	2006-10-02 21:00:35 UTC (rev 8578)
@@ -51,6 +51,9 @@
       available in non-Exit nodes is much higher then the bandwidth available
       in Exit nodes. (Fixes bug 200.)
     - Give more meaningful errors on control authentication failure.
+    - When deciding whether an IP is "local", check for IPs on the same /24
+      as us.  This prevents some false positives during reachability
+      detection.
 
   o Security Fixes, minor:
     - If a client asked for a server by name, and we didn't have a

Modified: tor/trunk/src/common/util.c
===================================================================
--- tor/trunk/src/common/util.c	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/src/common/util.c	2006-10-02 21:00:35 UTC (rev 8578)
@@ -1572,17 +1572,6 @@
   return 0;
 }
 
-/** Return true iff <b>ip</b> (in host order) is judged to be on the
- * same network as us. For now, check if it's an internal IP.
- *
- * XXX Also check if it's on the same class C network as our public IP.
- */
-int
-is_local_IP(uint32_t ip)
-{
-  return is_internal_IP(ip, 0);
-}
-
 /** Parse a string of the form "host[:port]" from <b>addrport</b>.  If
  * <b>address</b> is provided, set *<b>address</b> to a copy of the
  * host portion of the string.  If <b>addr</b> is provided, try to

Modified: tor/trunk/src/common/util.h
===================================================================
--- tor/trunk/src/common/util.h	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/src/common/util.h	2006-10-02 21:00:35 UTC (rev 8578)
@@ -188,7 +188,6 @@
 
 /* Net helpers */
 int is_internal_IP(uint32_t ip, int for_listening) ATTR_PURE;
-int is_local_IP(uint32_t ip) ATTR_PURE;
 int parse_addr_port(int severity, const char *addrport, char **address,
                     uint32_t *addr, uint16_t *port_out);
 int parse_port_range(const char *port, uint16_t *port_min_out,

Modified: tor/trunk/src/or/config.c
===================================================================
--- tor/trunk/src/or/config.c	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/src/or/config.c	2006-10-02 21:00:35 UTC (rev 8578)
@@ -1590,6 +1590,8 @@
 "See man page for options, or http://tor.eff.org/ for documentation.\n");
 }
 
+/** Last value actually set by resolve_my_address. */
+static uint32_t last_resolved_addr = 0;
 /**
  * Based on <b>options-\>Address</b>, guess our public IP address and put it
  * (in host order) into *<b>addr_out</b>. If <b>hostname_out</b> is provided,
@@ -1607,7 +1609,6 @@
   int explicit_ip=1;
   int explicit_hostname=1;
   char tmpbuf[INET_NTOA_BUF_LEN];
-  static uint32_t old_addr=0;
   const char *address = options->Address;
   int notice_severity = warn_severity <= LOG_NOTICE ?
                           LOG_NOTICE : warn_severity;
@@ -1714,18 +1715,41 @@
 
   log_debug(LD_CONFIG, "Resolved Address to '%s'.", tmpbuf);
   *addr_out = ntohl(in.s_addr);
-  if (old_addr && old_addr != *addr_out) {
+  if (last_resolved_addr && last_resolved_addr != *addr_out) {
     /* Leave this as a notice, regardless of the requested severity,
      * at least until dynamic IP address support becomes bulletproof. */
     log_notice(LD_NET, "Your IP address seems to have changed. Updating.");
     server_has_changed_ip();
   }
-  old_addr = *addr_out;
+  last_resolved_addr = *addr_out;
   if (hostname_out)
     *hostname_out = tor_strdup(hostname);
   return 0;
 }
 
+/** Return true iff <b>ip</b> (in host order) is judged to be on the
+ * same network as us, or on a private network.
+ */
+int
+is_local_IP(uint32_t ip)
+{
+  if (is_internal_IP(ip, 0))
+    return 1;
+  /* Check whether ip is on the same /24 as we are.
+   *
+   * It's possible that this next check will hit before the first time
+   * resolve_my_address actually succeeds.  (For clients, it is likely that
+   * resolve_my_address will never be called at all).  In those cases,
+   * last_resolved_addr will be 0, and so checking to see whether ip is on the
+   * same /24 as last_resolved_addr will be the same as checking whether it
+   * was on net 0, which is already done by is_internal_IP.
+   */
+  if ((last_resolved_addr & 0xffffff00ul) == (ip & 0xffffff00ul))
+    return 1;
+  return 0;
+}
+
+
 /** Called when we don't have a nickname set.  Try to guess a good nickname
  * based on the hostname, and return it in a newly allocated string. If we
  * can't, return NULL and let the caller warn if it wants to. */

Modified: tor/trunk/src/or/connection.c
===================================================================
--- tor/trunk/src/or/connection.c	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/src/or/connection.c	2006-10-02 21:00:35 UTC (rev 8578)
@@ -1425,7 +1425,7 @@
     *max_to_read = at_most - result;
   }
 
-  if (result > 0 && !is_local_IP(conn->addr)) { /* remember it */
+  if (result > 0 && !is_internal_IP(conn->addr, 0)) { /* remember it */
     rep_hist_note_bytes_read(result, time(NULL));
     connection_read_bucket_decrement(conn, result);
   }
@@ -1601,7 +1601,7 @@
   }
 
   if (result > 0) {
-    if (!is_local_IP(conn->addr)) { /* remember it */
+    if (!is_internal_IP(conn->addr, 0)) { /* remember it */
       rep_hist_note_bytes_written(result, time(NULL));
       global_write_bucket -= result;
     }
@@ -1646,7 +1646,7 @@
   }
 
   if (result > 0) {
-    if (!is_local_IP(conn->addr)) { /* remember it */
+    if (!is_internal_IP(conn->addr, 0)) { /* remember it */
       rep_hist_note_bytes_written(result, time(NULL));
       global_write_bucket -= result;
     }

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2006-10-02 21:00:24 UTC (rev 8577)
+++ tor/trunk/src/or/or.h	2006-10-02 21:00:35 UTC (rev 8578)
@@ -1821,6 +1821,7 @@
                          int clear_first, char **msg);
 int resolve_my_address(int warn_severity, or_options_t *options,
                        uint32_t *addr, char **hostname_out);
+int is_local_IP(uint32_t ip) ATTR_PURE;
 void options_init(or_options_t *options);
 int options_init_from_torrc(int argc, char **argv);
 int options_init_logs(or_options_t *options, int validate_only);



More information about the tor-commits mailing list