From: Nick Mathewson Date: Tue, 11 Oct 2011 16:02:19 +0000 (-0400) Subject: Stop using addr_port_lookup as an address splitting function X-Git-Tag: tor-0.2.3.6-alpha~28^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=426f6bfda2440f4de99c4579be773dfbabac039f;p=thirdparty%2Ftor.git 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. --- diff --git a/src/common/address.c b/src/common/address.c index 5c2b54015c..b41456f8de 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 *address_out to a newly allocated string + * holding the address portion and *port_out 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 addrport. If * address is provided, set *address to a copy of the * host portion of the string. If addr 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 01aeb89799..359b0264d2 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 2293a30614..508f69e5a6 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 dbd9c934f3..6fd8db296d 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);