aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-07-05 13:43:31 -0400
committerNick Mathewson <nickm@torproject.org>2017-07-05 13:43:31 -0400
commit0331e287741e53277ba9a444644cb71a711f395d (patch)
treec02d5b4f05b0ccd2816caff8874c0731d3643aab
parent6a3622154e2f5f8f481422caebaf2c09a6d91233 (diff)
parent0ee15c92d5486fc73ba49dea7f12bf2f89012cfb (diff)
downloadtor-0331e287741e53277ba9a444644cb71a711f395d.tar.gz
tor-0331e287741e53277ba9a444644cb71a711f395d.zip
Merge branch 'maint-0.2.4' into release-0.2.4
-rw-r--r--changes/bug227896
-rw-r--r--src/common/compat.c8
-rw-r--r--src/test/test_addr.c9
3 files changed, 21 insertions, 2 deletions
diff --git a/changes/bug22789 b/changes/bug22789
new file mode 100644
index 0000000000..dc9fa29811
--- /dev/null
+++ b/changes/bug22789
@@ -0,0 +1,6 @@
+ o Major bugfixes (openbsd, denial-of-service):
+ - Avoid an assertion failure bug affecting our implementation of
+ inet_pton(AF_INET6) on certain OpenBSD systems whose strtol()
+ handling of "0xfoo" differs from what we had expected.
+ Fixes bug 22789; bugfix on 0.2.3.8-alpha.
+
diff --git a/src/common/compat.c b/src/common/compat.c
index d88c5f92de..b77f25b467 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -2045,8 +2045,12 @@ tor_inet_pton(int af, const char *src, void *dst)
char *next;
ssize_t len;
long r = strtol(src, &next, 16);
- tor_assert(next != NULL);
- tor_assert(next != src);
+ if (next == NULL || next == src) {
+ /* The 'next == src' error case can happen on versions of openbsd
+ * where treats "0xfoo" as an error, rather than as "0" followed by
+ * "xfoo". */
+ return 0;
+ }
len = *next == '\0' ? eow - src : next - src;
if (len > 4)
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index fec85a4696..645fc643db 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -340,6 +340,15 @@ test_addr_ip6_helpers(void)
test_pton6_bad("a:::b:c");
test_pton6_bad(":::a:b:c");
test_pton6_bad("a:b:c:::");
+ /* Regression tests for 22789. */
+ test_pton6_bad("0xfoo");
+ test_pton6_bad("0x88");
+ test_pton6_bad("0xyxxy");
+ test_pton6_bad("0XFOO");
+ test_pton6_bad("0X88");
+ test_pton6_bad("0XYXXY");
+ test_pton6_bad("0x");
+ test_pton6_bad("0X");
/* test internal checking */
test_external_ip("fbff:ffff::2:7", 0);