aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Engelhardt <[email protected]>2024-03-04 10:45:49 +0000
committerGitHub <[email protected]>2024-03-04 10:45:49 +0000
commitc6b01fcc32956518ce010d4d367b844c006958d2 (patch)
tree3f7b4fdf40c8d4ca5d26825427c853b55e165c99
parenturl: add remark to documentation about hardcoded // substring (#293) (diff)
downloadvmime-c6b01fcc32956518ce010d4d367b844c006958d2.tar.gz
vmime-c6b01fcc32956518ce010d4d367b844c006958d2.zip
url: repair off-by-one bug in extractHost (#297)
`hostPart[len]` is pointing to `]`, but we need to check the char after that. Fixes: v0.9.2-187-g874a1d8c
-rw-r--r--src/vmime/utility/url.cpp2
-rw-r--r--tests/utility/urlTest.cpp13
2 files changed, 12 insertions, 3 deletions
diff --git a/src/vmime/utility/url.cpp b/src/vmime/utility/url.cpp
index 334e78fc..e8978d28 100644
--- a/src/vmime/utility/url.cpp
+++ b/src/vmime/utility/url.cpp
@@ -180,7 +180,7 @@ static bool extractHostIPv6(string& hostPart, string& host, string& port) {
host.assign(&hostPart[1], len - 1);
- if (hostPart[len] == '\0') {
+ if (hostPart[len + 1] == '\0') {
return true;
}
if (hostPart[len + 1] != ':') {
diff --git a/tests/utility/urlTest.cpp b/tests/utility/urlTest.cpp
index c792c772..aca8300e 100644
--- a/tests/utility/urlTest.cpp
+++ b/tests/utility/urlTest.cpp
@@ -35,7 +35,8 @@ VMIME_TEST_SUITE_BEGIN(urlTest)
VMIME_TEST(testParse3)
VMIME_TEST(testParse4)
VMIME_TEST(testParse5)
- VMIME_TEST(testParseIPv6)
+ VMIME_TEST(testParseIPv6Full)
+ VMIME_TEST(testParseIPv6NoPort)
VMIME_TEST(testGenerate)
VMIME_TEST(testUtilsEncode)
VMIME_TEST(testUtilsDecode)
@@ -202,7 +203,7 @@ VMIME_TEST_SUITE_BEGIN(urlTest)
VASSERT_EQ("4", "myserver.com", u1.getHost());
}
- void testParseIPv6() {
+ void testParseIPv6Full() {
vmime::utility::url u1("", "");
@@ -214,6 +215,14 @@ VMIME_TEST_SUITE_BEGIN(urlTest)
VASSERT_EQ("6", "/p", u1.getPath());
}
+ void testParseIPv6NoPort() {
+
+ vmime::utility::url u1("", "");
+
+ VASSERT_EQ("1", true, parseHelper(u1, "http://[::1]/"));
+ VASSERT_EQ("2", "::1", u1.getHost());
+ }
+
void testGenerate() {
vmime::utility::url u1("proto", "host", 12345, "path", "user", "password");