commit 742cd1564993faefded2d33b6839428a1fe4412a
Author: rl1987 <rl1987(a)sdf.lonestar.org>
Date: Sat Sep 1 20:56:33 2018 +0300
Move a check for trailing colon to tor_inet_pton()
That way, string_is_valid_ipv6_address() can benefit from it
---
src/lib/net/address.c | 5 +----
src/lib/net/inaddr.c | 8 +++++++-
src/test/test_util.c | 13 +++++++++++++
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/src/lib/net/address.c b/src/lib/net/address.c
index 336693b46..17f4b1cf7 100644
--- a/src/lib/net/address.c
+++ b/src/lib/net/address.c
@@ -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 &&
diff --git a/src/lib/net/inaddr.c b/src/lib/net/inaddr.c
index dcd8fcdd6..0960d323c 100644
--- a/src/lib/net/inaddr.c
+++ b/src/lib/net/inaddr.c
@@ -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
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 6cbd504e3..0921bae10 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -5750,6 +5750,18 @@ test_util_ipv4_validation(void *arg)
}
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)
{
(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),