diff options
author | Vincent Richard <[email protected]> | 2021-05-16 16:43:14 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-05-16 16:43:14 +0000 |
commit | edcb4b4b1f1feb5d823d2eaba6aa6dda462d0b00 (patch) | |
tree | 502687efd998471775e27b78d41aee4f979289ee | |
parent | #261 Workaround for bad SEARCH response with AOL IMAP server (diff) | |
parent | fixed coding style (diff) | |
download | vmime-edcb4b4b1f1feb5d823d2eaba6aa6dda462d0b00.tar.gz vmime-edcb4b4b1f1feb5d823d2eaba6aa6dda462d0b00.zip |
Merge pull request #262 from ibanic/master
Prevent accessing empty buffer when using FilteredOutputStream with ICU
-rw-r--r-- | src/vmime/charsetConverter_icu.cpp | 6 | ||||
-rw-r--r-- | tests/parser/charsetTest.cpp | 27 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/vmime/charsetConverter_icu.cpp b/src/vmime/charsetConverter_icu.cpp index 56394797..5016dca8 100644 --- a/src/vmime/charsetConverter_icu.cpp +++ b/src/vmime/charsetConverter_icu.cpp @@ -433,6 +433,9 @@ void charsetFilteredOutputStream_icu::writeImpl( } const size_t uniLength = uniTarget - &uniBuffer[0]; + if(uniLength == 0) { + continue; + } // Allocate buffer for destination charset const size_t cpSize = ucnv_getMinCharSize(m_to) * uniLength; @@ -520,6 +523,9 @@ void charsetFilteredOutputStream_icu::flush() { } const size_t uniLength = uniTarget - &uniBuffer[0]; + if(uniLength == 0) { + continue; + } // Allocate buffer for destination charset const size_t cpSize = ucnv_getMinCharSize(m_to) * uniLength; diff --git a/tests/parser/charsetTest.cpp b/tests/parser/charsetTest.cpp index e44bef5b..01b04e11 100644 --- a/tests/parser/charsetTest.cpp +++ b/tests/parser/charsetTest.cpp @@ -34,6 +34,7 @@ VMIME_TEST_SUITE_BEGIN(charsetTest) // Test valid input VMIME_TEST(testConvertStringValid) VMIME_TEST(testConvertStreamValid) + VMIME_TEST(testConvertStreamExtract) VMIME_TEST(testEncodingHebrew1255) // IDNA @@ -104,6 +105,32 @@ VMIME_TEST_SUITE_BEGIN(charsetTest) } } + void testConvertStreamExtract() { + vmime::bodyPart p; + p.getBody()->setContents( + vmime::make_shared <vmime::stringContentHandler>( + "Foo éé\r\né bar\r\nbaz" + ), + vmime::mediaType("text", "plain"), + vmime::charset("utf-8"), + vmime::encoding("quoted-printable") + ); + + vmime::string str; + vmime::utility::outputStreamStringAdapter outStr(str); + vmime::shared_ptr <vmime::charsetConverter> conv = vmime::charsetConverter::create(p.getBody()->getCharset(), vmime::charset("US-ASCII")); + auto filteredStream = conv->getFilteredOutputStream(outStr); + p.getBody()->getContents()->extract(*filteredStream); + filteredStream->flush(); + VASSERT_EQ( + "generate", + "Foo ??\r\n" + "? bar\r\n" + "baz", + str + ); + } + void testEncodingHebrew1255() { // hewbrew string in windows-1255 charset |