fix urldb numerical v6 address handling

This commit is contained in:
Vincent Sanders 2017-03-13 23:44:06 +00:00
parent 089179a5b1
commit 2406acfeb3
2 changed files with 25 additions and 6 deletions

View File

@ -634,6 +634,7 @@ static bool urldb__host_is_ip_address(const char *host)
#ifndef NO_IPV6
struct in6_addr ipv6;
char ipv6_addr[64];
unsigned int ipv6_addr_len;
#endif
/**
* @todo FIXME Some parts of urldb.c make confusions between hosts
@ -660,7 +661,7 @@ static bool urldb__host_is_ip_address(const char *host)
char *c = strdup(host);
c[slash - host] = '\0';
sane_host = c;
host_len = slash - host - 1;
host_len = slash - host;
LOG("WARNING: called with non-host '%s'", host);
}
@ -688,11 +689,18 @@ static bool urldb__host_is_ip_address(const char *host)
}
#ifndef NO_IPV6
if (sane_host[0] != '[' || sane_host[host_len] != ']')
if ((host_len < 6) ||
(sane_host[0] != '[') ||
(sane_host[host_len - 1] != ']')) {
goto out_false;
}
strncpy(ipv6_addr, sane_host + 1, sizeof(ipv6_addr));
ipv6_addr[sizeof(ipv6_addr) - 1] = '\0';
ipv6_addr_len = host_len - 2;
if (ipv6_addr_len > sizeof(ipv6_addr)) {
ipv6_addr_len = sizeof(ipv6_addr);
}
strncpy(ipv6_addr, sane_host + 1, ipv6_addr_len);
ipv6_addr[ipv6_addr_len] = '\0';
if (inet_pton(AF_INET6, ipv6_addr, &ipv6) == 1)
goto out_true;

View File

@ -808,7 +808,7 @@ START_TEST(urldb_iterate_partial_numeric_v6_test)
nsurl *url;
cb_count = 0;
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]/",
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]",
urldb_iterate_entries_cb);
ck_assert_int_eq(cb_count, 0);
@ -817,9 +817,20 @@ START_TEST(urldb_iterate_partial_numeric_v6_test)
nsurl_unref(url);
cb_count = 0;
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]/",
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]/index.wrong",
urldb_iterate_entries_cb);
ck_assert_int_eq(cb_count, 0);
cb_count = 0;
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]",
urldb_iterate_entries_cb);
ck_assert_int_eq(cb_count, 1);
cb_count = 0;
urldb_iterate_partial("[2001:db8:1f70::999:de8:7648:6e8]/in",
urldb_iterate_entries_cb);
ck_assert_int_eq(cb_count, 1);
}
END_TEST