summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/urldb.c16
-rw-r--r--test/urldbtest.c15
2 files changed, 25 insertions, 6 deletions
diff --git a/content/urldb.c b/content/urldb.c
index f386aa941..d702e581b 100644
--- a/content/urldb.c
+++ b/content/urldb.c
@@ -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;
diff --git a/test/urldbtest.c b/test/urldbtest.c
index ab4316360..793b04abb 100644
--- a/test/urldbtest.c
+++ b/test/urldbtest.c
@@ -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