[tor-commits] [tor/master] Stop using addr_port_lookup as an address splitting function

nickm at torproject.org nickm at torproject.org
Tue Oct 11 19:56:35 UTC 2011


commit 426f6bfda2440f4de99c4579be773dfbabac039f
Author: Nick Mathewson <nickm at torproject.org>
Date:   Tue Oct 11 12:02:19 2011 -0400

    Stop using addr_port_lookup as an address splitting function
    
    It's too risky to have a function where if you leave one parameter
    NULL, it splits up address:port strings, but if you set it, it does
    hostname resolution.
---
 src/common/address.c     |   16 +++++++++++++++-
 src/common/address.h     |    3 +++
 src/or/connection_edge.c |    6 +++---
 src/or/routerparse.c     |    6 +++---
 4 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/common/address.c b/src/common/address.c
index 5c2b540..b41456f 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -1148,6 +1148,20 @@ is_internal_IP(uint32_t ip, int for_listening)
   return tor_addr_is_internal(&myaddr, for_listening);
 }
 
+/** Given an address of the form "host:port", try to divide it into its host
+ * ane port portions, setting *<b>address_out</b> to a newly allocated string
+ * holding the address portion and *<b>port_out</b> to the port (or 0 if no
+ * port is given).  Return 0 on success, -1 on failure. */
+int
+tor_addr_port_split(int severity, const char *addrport,
+                    char **address_out, uint16_t *port_out)
+{
+  tor_assert(addrport);
+  tor_assert(address_out);
+  tor_assert(port_out);
+  return addr_port_lookup(severity, addrport, address_out, NULL, port_out);
+}
+
 /** 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
@@ -1169,7 +1183,7 @@ addr_port_lookup(int severity, const char *addrport, char **address,
 
   tor_assert(addrport);
 
-  colon = strchr(addrport, ':');
+  colon = strrchr(addrport, ':');
   if (colon) {
     _address = tor_strndup(addrport, colon-addrport);
     _port = (int) tor_parse_long(colon+1,10,1,65535,NULL,NULL);
diff --git a/src/common/address.h b/src/common/address.h
index 01aeb89..359b026 100644
--- a/src/common/address.h
+++ b/src/common/address.h
@@ -181,6 +181,9 @@ void tor_addr_from_in6(tor_addr_t *dest, const struct in6_addr *in6);
 int tor_addr_is_null(const tor_addr_t *addr);
 int tor_addr_is_loopback(const tor_addr_t *addr);
 
+int tor_addr_port_split(int severity, const char *addrport,
+                        char **address_out, uint16_t *port_out);
+
 /* IPv4 helpers */
 int is_internal_IP(uint32_t ip, int for_listening) ATTR_PURE;
 int addr_port_lookup(int severity, const char *addrport, char **address,
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 2293a30..508f69e 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -2894,9 +2894,9 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
                                     END_STREAM_REASON_TORPROTOCOL, NULL);
       return 0;
     }
-    if (addr_port_lookup(LOG_PROTOCOL_WARN,
-                        (char*)(cell->payload+RELAY_HEADER_SIZE),
-                        &address,NULL,&port)<0) {
+    if (tor_addr_port_split(LOG_PROTOCOL_WARN,
+                            (char*)(cell->payload+RELAY_HEADER_SIZE),
+                            &address,&port)<0) {
       log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
              "Unable to parse addr:port in relay begin cell. Closing.");
       relay_send_end_cell_from_edge(rh.stream_id, circ,
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index dbd9c93..6fd8db2 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -1812,9 +1812,9 @@ authority_cert_parse_from_string(const char *s, const char **end_of_string)
     struct in_addr in;
     char *address = NULL;
     tor_assert(tok->n_args);
-    /* XXX023 use tor_addr_port_lookup() below instead. -RD */
-    if (addr_port_lookup(LOG_WARN, tok->args[0], &address, NULL,
-                        &cert->dir_port)<0 ||
+    /* XXX023 use some tor_addr parse function below instead. -RD */
+    if (tor_addr_port_split(LOG_WARN, tok->args[0], &address,
+                            &cert->dir_port) < 0 ||
         tor_inet_aton(address, &in) == 0) {
       log_warn(LD_DIR, "Couldn't parse dir-address in certificate");
       tor_free(address);





More information about the tor-commits mailing list