]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Removing is_internal_IP() function. Resolves ticket 4645.
authorrl1987 <rl1987@sdf.lonestar.org>
Sat, 16 Nov 2013 16:29:54 +0000 (18:29 +0200)
committerNick Mathewson <nickm@torproject.org>
Mon, 3 Feb 2014 19:20:17 +0000 (14:20 -0500)
changes/ticket4645 [new file with mode: 0644]
src/common/address.c
src/common/address.h
src/or/config.c
src/or/directory.c
src/or/dirserv.c
src/test/test_addr.c

diff --git a/changes/ticket4645 b/changes/ticket4645
new file mode 100644 (file)
index 0000000..cc665ba
--- /dev/null
@@ -0,0 +1,3 @@
+  o Code simplifications and refactoring:
+    - Removing is_internal_IP() function. Resolves ticket 4645.
+
index b9f2d931549ae483c10fc3ec26fc23f7a7865362..0b5bb228068014f46a8a84b948a2243829aabf8e 100644 (file)
@@ -1421,19 +1421,6 @@ get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
  * XXXX024 IPv6 deprecate some of these.
  */
 
-/** Return true iff <b>ip</b> (in host order) is an IP reserved to localhost,
- * or reserved for local networks by RFC 1918.
- */
-int
-is_internal_IP(uint32_t ip, int for_listening)
-{
-  tor_addr_t myaddr;
-  myaddr.family = AF_INET;
-  myaddr.addr.in_addr.s_addr = htonl(ip);
-
-  return tor_addr_is_internal(&myaddr, for_listening);
-}
-
 /** Given an address of the form "ip:port", try to divide it into its
  * ip and port portions, setting *<b>address_out</b> to a newly
  * allocated string holding the address portion and *<b>port_out</b>
index 77e585534635133ff9a21e24b0e9c59b0b0888db..bdca1f2947b73649392c4e1905d4e0da738dbeb9 100644 (file)
@@ -214,7 +214,6 @@ int tor_addr_port_parse(int severity, const char *addrport,
 int tor_addr_hostname_is_local(const char *name);
 
 /* IPv4 helpers */
-int is_internal_IP(uint32_t ip, int for_listening);
 int addr_port_lookup(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,
index e7847d5830816c64723374ff52d15555c87cd069..f840b5e287fec86443e205f73eeda36d73799228 100644 (file)
@@ -2053,6 +2053,7 @@ resolve_my_address(int warn_severity, const or_options_t *options,
   int notice_severity = warn_severity <= LOG_NOTICE ?
                           LOG_NOTICE : warn_severity;
 
+  tor_addr_t myaddr;
   tor_assert(addr_out);
 
   /*
@@ -2103,8 +2104,11 @@ resolve_my_address(int warn_severity, const or_options_t *options,
              "local interface. Using that.", fmt_addr32(addr));
       strlcpy(hostname, "<guessed from interfaces>", sizeof(hostname));
     } else { /* resolved hostname into addr */
+      myaddr.family = AF_INET;
+      myaddr.addr.in_addr.s_addr = htonl(addr);
+
       if (!explicit_hostname &&
-          is_internal_IP(addr, 0)) {
+          tor_addr_is_internal(&myaddr, 0)) {
         uint32_t interface_ip;
 
         log_fn(notice_severity, LD_CONFIG, "Guessed local hostname '%s' "
@@ -2114,7 +2118,7 @@ resolve_my_address(int warn_severity, const or_options_t *options,
         if (get_interface_address(warn_severity, &interface_ip)) {
           log_fn(warn_severity, LD_CONFIG,
                  "Could not get local interface IP address. Too bad.");
-        } else if (is_internal_IP(interface_ip, 0)) {
+        } else if (tor_addr_is_internal(&myaddr, 0)) {
           log_fn(notice_severity, LD_CONFIG,
                  "Interface IP address '%s' is a private address too. "
                  "Ignoring.", fmt_addr32(interface_ip));
@@ -2138,8 +2142,11 @@ resolve_my_address(int warn_severity, const or_options_t *options,
    * out if it is and we don't want that.
    */
 
+  myaddr.family = AF_INET;
+  myaddr.addr.in_addr.s_addr = htonl(addr);
+
   addr_string = tor_dup_ip(addr);
-  if (is_internal_IP(addr, 0)) {
+  if (tor_addr_is_internal(&myaddr, 0)) {
     /* make sure we're ok with publishing an internal IP */
     if (!options->DirAuthorities && !options->AlternateDirAuthority) {
       /* if they are using the default authorities, disallow internal IPs
@@ -2245,7 +2252,7 @@ is_local_addr(const tor_addr_t *addr)
      * 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.
+     * it was on net 0, which is already done by tor_addr_is_internal.
      */
     if ((last_resolved_addr & (uint32_t)0xffffff00ul)
         == (ip & (uint32_t)0xffffff00ul))
index 0cacf0661746983a331f8980e0fdd917220ac0a7..7f26affa20044860063c20bd94ffdf4c2e02f443 100644 (file)
@@ -1415,12 +1415,23 @@ http_set_address_origin(const char *headers, connection_t *conn)
     fwd = http_get_header(headers, "X-Forwarded-For: ");
   if (fwd) {
     struct in_addr in;
-    if (!tor_inet_aton(fwd, &in) || is_internal_IP(ntohl(in.s_addr), 0)) {
-      log_debug(LD_DIR, "Ignoring unrecognized or internal IP %s",
+    if (!tor_inet_aton(fwd, &in)) {
+      log_debug(LD_DIR, "Ignoring unrecognized IP %s",
                 escaped(fwd));
       tor_free(fwd);
       return;
     }
+
+    tor_addr_t toraddr;
+    toraddr.family = AF_INET;
+    toraddr.addr.in_addr = in;
+
+    if (tor_addr_is_internal(&toraddr,0)) {
+      log_debug(LD_DIR, "Ignoring local IP %s", escaped(fwd));
+      tor_free(fwd);
+      return;
+    }
+
     tor_free(conn->address);
     conn->address = tor_strdup(fwd);
     tor_free(fwd);
index c0e000c7598662d88a7bc6a5e6a3ff1e9ff6f20c..4a25f99a49be5d45c136cb41ecbcd1b150a766c2 100644 (file)
@@ -533,7 +533,12 @@ dirserv_router_has_valid_address(routerinfo_t *ri)
              ri->address);
     return -1;
   }
-  if (is_internal_IP(ntohl(iaddr.s_addr), 0)) {
+
+  tor_addr_t toraddr;
+  toraddr.family = AF_INET;
+  toraddr.addr.in_addr = iaddr;
+
+  if (tor_addr_is_internal(&toraddr, 0)) {
     log_info(LD_DIRSERV,
              "Router %s published internal IP address '%s'. Refusing.",
              router_describe(ri), ri->address);
index 4bc602df842446f76d0570612d23af8a4eb23220..829697b1e89ea6a3ab031e81e76c4741dcc82f22 100644 (file)
@@ -402,7 +402,6 @@ test_addr_ip6_helpers(void)
   test_internal_ip("::ffff:169.254.0.0", 0);
   test_internal_ip("::ffff:169.254.255.255", 0);
   test_external_ip("::ffff:169.255.0.0", 0);
-  test_assert(is_internal_IP(0x7f000001, 0));
 
   /* tor_addr_compare(tor_addr_t x2) */
   test_addr_compare("ffff::", ==, "ffff::0");