diff options
author | Vincent Richard <[email protected]> | 2011-03-09 18:03:31 +0000 |
---|---|---|
committer | Vincent Richard <[email protected]> | 2011-03-09 18:03:31 +0000 |
commit | 98b4d91d013ba8d6ef70a9601d6b46bde9db872a (patch) | |
tree | 9837ff4dceb06a36eb550d64d69585c522ffeb9e /src/word.cpp | |
parent | Fixed possible read to invalid memory location (thanks to Alexander Konovalov). (diff) | |
download | vmime-98b4d91d013ba8d6ef70a9601d6b46bde9db872a.tar.gz vmime-98b4d91d013ba8d6ef70a9601d6b46bde9db872a.zip |
Fixed bug #3174903. Fixed word parsing when buffer does not end with NL. Fixed 'no encoding' when forced.
Diffstat (limited to 'src/word.cpp')
-rw-r--r-- | src/word.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/word.cpp b/src/word.cpp index fa08d33f..aeaa7371 100644 --- a/src/word.cpp +++ b/src/word.cpp @@ -102,7 +102,9 @@ ref <word> word::parseNext(const string& buffer, const string::size_type positio ++pos; unencoded += buffer.substr(startPos, endPos - startPos); - unencoded += ' '; + + if (pos != end) // ignore white-spaces at end + unencoded += ' '; startPos = pos; continue; @@ -191,14 +193,15 @@ ref <word> word::parseNext(const string& buffer, const string::size_type positio ++pos; } - // Treat unencoded text at the end of the buffer - if (end != startPos) - { - if (startPos != pos && !isFirst && prevIsEncoded) - unencoded += whiteSpaces; + if (startPos != end && !isFirst && prevIsEncoded) + unencoded += whiteSpaces; + if (startPos != end) unencoded += buffer.substr(startPos, end - startPos); + // Treat unencoded text at the end of the buffer + if (!unencoded.empty()) + { ref <word> w = vmime::create <word>(unencoded, charset(charsets::US_ASCII)); w->setParsedBounds(position, end); @@ -337,12 +340,14 @@ void word::generate(utility::outputStream& os, const string::size_type maxLineLe state = &defaultGeneratorState; // Find out if encoding is forced or required by contents + charset - bool encodingNeeded = (flags & text::FORCE_ENCODING) != 0; + bool encodingNeeded = false; - if (encodingNeeded == false) - encodingNeeded = wordEncoder::isEncodingNeeded(m_buffer, m_charset); - else if ((flags & text::FORCE_NO_ENCODING) != 0) + if ((flags & text::FORCE_NO_ENCODING) != 0) encodingNeeded = false; + else if ((flags & text::FORCE_ENCODING) != 0) + encodingNeeded = true; + else // auto-detect + encodingNeeded = wordEncoder::isEncodingNeeded(m_buffer, m_charset); // If possible and requested (with flag), quote the buffer (no folding is performed). // Quoting is possible if and only if: |