]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Move a check for trailing colon to tor_inet_pton()
authorrl1987 <rl1987@sdf.lonestar.org>
Sat, 1 Sep 2018 17:56:33 +0000 (20:56 +0300)
committerNick Mathewson <nickm@torproject.org>
Tue, 30 Oct 2018 13:05:11 +0000 (09:05 -0400)
That way, string_is_valid_ipv6_address() can benefit from it

src/lib/net/address.c
src/lib/net/inaddr.c
src/test/test_util.c

index 336693b464a8a13d8868080e33172986fed4a7d8..17f4b1cf7a54dd19ff94ac5ee344a4cecaa77dd3 100644 (file)
@@ -1198,10 +1198,7 @@ tor_addr_parse(tor_addr_t *addr, const char *src)
     len -= 2;
   }
 
-  /* Reject if src has needless trailing ':'. */
-  if (len > 2 && src[len - 1] == ':' && src[len - 2] != ':') {
-    result = -1;
-  } else if (tor_inet_pton(AF_INET6, src, &in6_tmp) > 0) {
+  if (tor_inet_pton(AF_INET6, src, &in6_tmp) > 0) {
     result = AF_INET6;
     tor_addr_from_in6(addr, &in6_tmp);
   } else if (!brackets_detected &&
index dcd8fcdd652b387087ed4b1037fea180f1d58c4f..0960d323c545ad872c35c1cae3ff62fa2f91497a 100644 (file)
@@ -168,6 +168,13 @@ tor_inet_pton(int af, const char *src, void *dst)
   if (af == AF_INET) {
     return tor_inet_aton(src, dst);
   } else if (af == AF_INET6) {
+    ssize_t len = strlen(src);
+
+    /* Reject if src has needless trailing ':'. */
+    if (len > 2 && src[len - 1] == ':' && src[len - 2] != ':') {
+      return 0;
+    }
+
     struct in6_addr *out = dst;
     uint16_t words[8];
     int gapPos = -1, i, setWords=0;
@@ -207,7 +214,6 @@ tor_inet_pton(int af, const char *src, void *dst)
         return 0;
       if (TOR_ISXDIGIT(*src)) {
         char *next;
-        ssize_t len;
         long r = strtol(src, &next, 16);
         if (next == NULL || next == src) {
           /* The 'next == src' error case can happen on versions of openbsd
index 6cbd504e349297a8d64ab35078fab91ecd211a85..0921bae109093e7df3e7935f57f1d83cece87825 100644 (file)
@@ -5749,6 +5749,18 @@ test_util_ipv4_validation(void *arg)
   return;
 }
 
+static void
+test_util_ipv6_validation(void *arg)
+{
+  (void)arg;
+
+  tt_assert(string_is_valid_ipv6_address("2a00:1450:401b:800::200e"));
+  tt_assert(!string_is_valid_ipv6_address("11:22::33:44:"));
+
+  done:
+  return;
+}
+
 static void
 test_util_writepid(void *arg)
 {
@@ -6439,6 +6451,7 @@ struct testcase_t util_tests[] = {
   UTIL_TEST(hostname_validation, 0),
   UTIL_TEST(dest_validation_edgecase, 0),
   UTIL_TEST(ipv4_validation, 0),
+  UTIL_TEST(ipv6_validation, 0),
   UTIL_TEST(writepid, 0),
   UTIL_TEST(get_avail_disk_space, 0),
   UTIL_TEST(touch_file, 0),