From 97d15b8cd77998f37c279a023aa9f07def956e60 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Tue, 21 May 2024 15:45:29 +0200 Subject: vmime: avoid changing SEVEN_BIT when encoding::decideImpl sees U+007F (#303) * vmime: avoid changing SEVEN_BIT when encoding::decideImpl sees U+007F Do not switch to QP/B64 when encountering U+007F. U+007F is part of ASCII just as much as U+0001 is. --------- Co-authored-by: Vincent Richard --- src/vmime/encoding.cpp | 2 +- tests/parser/charsetTest.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vmime/encoding.cpp b/src/vmime/encoding.cpp index e66e268a..bca31573 100644 --- a/src/vmime/encoding.cpp +++ b/src/vmime/encoding.cpp @@ -157,7 +157,7 @@ const encoding encoding::decideImpl( const string::difference_type length = end - begin; const string::difference_type count = std::count_if( - begin, end, [](unsigned char x) { return x < 127; }); + begin, end, [](unsigned char x) { return x <= 127; }); // All is in 7-bit US-ASCII --> 7-bit (or Quoted-Printable...) if (length == count) { diff --git a/tests/parser/charsetTest.cpp b/tests/parser/charsetTest.cpp index 01b04e11..362cb5f0 100644 --- a/tests/parser/charsetTest.cpp +++ b/tests/parser/charsetTest.cpp @@ -36,6 +36,7 @@ VMIME_TEST_SUITE_BEGIN(charsetTest) VMIME_TEST(testConvertStreamValid) VMIME_TEST(testConvertStreamExtract) VMIME_TEST(testEncodingHebrew1255) + //VMIME_TEST(testEncodingSelectionOnASCII) // IDNA VMIME_TEST(testEncodeIDNA) @@ -141,6 +142,16 @@ VMIME_TEST_SUITE_BEGIN(charsetTest) VASSERT_EQ("1", "=?windows-1255?B?6fn3+On5+Pfp6fk=?=", encoded); } +#if 0 /* decideImpl is not public */ + void testEncodingSelectionOnASCII() { + + const std::string a = "Hi\x01!", b = "Hi\x7f!"; + VASSERT_EQ("1", vmime::encoding::decideImpl(std::begin(a), std::end(a)), + vmime::encoding::decideImpl(std::begin(b), std::end(b))); + + } +#endif + static const vmime::string convertHelper( const vmime::string& in, const vmime::charset& csrc, -- cgit v1.2.3