]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Make tor_addr_port_parse handle portless IPv6 addresses correctly.
authorNick Mathewson <nickm@torproject.org>
Sat, 5 Apr 2014 18:41:37 +0000 (14:41 -0400)
committerNick Mathewson <nickm@torproject.org>
Sat, 5 Apr 2014 18:41:37 +0000 (14:41 -0400)
(Not a bugfix on any Tor release; before 10801_024, it didn't handle
portless addresses at all.)

src/common/address.c
src/test/test_addr.c

index 3e898611dec73d72df449d06efb753ffa2dd79cb..84565582ec805955f1ce2a26f680d69994d08f8f 100644 (file)
@@ -1488,9 +1488,18 @@ int
 tor_addr_port_split(int severity, const char *addrport,
                     char **address_out, uint16_t *port_out)
 {
+  tor_addr_t a_tmp;
   tor_assert(addrport);
   tor_assert(address_out);
   tor_assert(port_out);
+  /* We need to check for IPv6 manually because addr_port_lookup() doesn't
+   * do a good job on IPv6 addresses that lack a port. */
+  if (tor_addr_parse(&a_tmp, addrport) == AF_INET6) {
+    *port_out = 0;
+    *address_out = tor_strdup(addrport);
+    return 0;
+  }
+
   return addr_port_lookup(severity, addrport, address_out, NULL, port_out);
 }
 
index 6228fabad6c7eb957fc3cf44e336230370dcf5ac..c75f8e6a1c498bf43bf4b53a80d943e604522a7e 100644 (file)
@@ -741,6 +741,14 @@ test_addr_parse(void)
   test_streq(buf, "192.0.2.1");
   test_eq(port, 1234);
 
+  r= tor_addr_port_parse(LOG_DEBUG,
+                         "[::1]:1234",
+                         &addr, &port, -1);
+  test_assert(r == 0);
+  tor_addr_to_str(buf, &addr, sizeof(buf), 0);
+  test_streq(buf, "::1");
+  test_eq(port, 1234);
+
   /* Domain name. */
   r= tor_addr_port_parse(LOG_DEBUG,
                          "torproject.org:1234",
@@ -759,6 +767,17 @@ test_addr_parse(void)
   test_assert(r == 0);
   tt_int_op(port,==,200);
 
+  r= tor_addr_port_parse(LOG_DEBUG,
+                         "[::1]",
+                         &addr, &port, -1);
+  test_assert(r == -1);
+
+  r= tor_addr_port_parse(LOG_DEBUG,
+                         "[::1]",
+                         &addr, &port, 400);
+  test_assert(r == 0);
+  tt_int_op(port,==,400);
+
   /* Bad port. */
   r= tor_addr_port_parse(LOG_DEBUG,
                          "192.0.2.2:66666",
@@ -793,6 +812,12 @@ test_addr_parse(void)
   test_assert(r == 0);
   tt_int_op(port,==,1337);
 
+  r= tor_addr_port_parse(LOG_DEBUG,
+                         "[::1]:1369",
+                         &addr, &port, 200);
+  test_assert(r == 0);
+  tt_int_op(port,==,1369);
+
  done:
   ;
 }