diff --git a/src/idna.c b/src/idna.c index 93d982ca018f2d39d9c0ffab07998c2c637029eb..858b19d00ee4239879357f2ec0231cb6d84e4186 100644 --- a/src/idna.c +++ b/src/idna.c @@ -274,6 +274,9 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { char* ds; int rc; + if (s == se) + return UV_EINVAL; + ds = d; si = s; @@ -308,8 +311,9 @@ long uv__idna_toascii(const char* s, const char* se, char* d, char* de) { return rc; } - if (d < de) - *d++ = '\0'; + if (d >= de) + return UV_EINVAL; + *d++ = '\0'; return d - ds; /* Number of bytes written. */ } diff --git a/test/test-idna.c b/test/test-idna.c index 77af3a9da0341c53c05a06920dd909324c00d8d9..180a6a685ac23f3183d84ab8d77b43c26f341e40 100644 --- a/test/test-idna.c +++ b/test/test-idna.c @@ -99,7 +99,7 @@ TEST_IMPL(utf8_decode1) { TEST_IMPL(utf8_decode1_overrun) { const char* p; char b[1]; - + char c[1]; /* Single byte. */ p = b; b[0] = 0x7F; @@ -110,7 +110,11 @@ TEST_IMPL(utf8_decode1_overrun) { p = b; b[0] = 0xC0; ASSERT_EQ((unsigned int) -1, uv__utf8_decode1(&p, b + 1)); - ASSERT_EQ(p, b + 1); + ASSERT_PTR_EQ(p, b + 1); + + b[0] = 0x7F; + ASSERT_EQ(UV_EINVAL, uv__idna_toascii(b, b + 0, c, c + 1)); + ASSERT_EQ(UV_EINVAL, uv__idna_toascii(b, b + 1, c, c + 1)); return 0; } @@ -145,8 +149,8 @@ TEST_IMPL(idna_toascii) { /* Illegal inputs. */ F("\xC0\x80\xC1\x80", UV_EINVAL); /* Overlong UTF-8 sequence. */ F("\xC0\x80\xC1\x80.com", UV_EINVAL); /* Overlong UTF-8 sequence. */ + F("", UV_EINVAL); /* No conversion. */ - T("", ""); T(".", "."); T(".com", ".com"); T("example", "example");