aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2011-03-09 18:03:31 +0000
committerVincent Richard <[email protected]>2011-03-09 18:03:31 +0000
commit98b4d91d013ba8d6ef70a9601d6b46bde9db872a (patch)
tree9837ff4dceb06a36eb550d64d69585c522ffeb9e /src
parentFixed possible read to invalid memory location (thanks to Alexander Konovalov). (diff)
downloadvmime-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')
-rw-r--r--src/body.cpp14
-rw-r--r--src/word.cpp25
2 files changed, 25 insertions, 14 deletions
diff --git a/src/body.cpp b/src/body.cpp
index 738d3e71..85968330 100644
--- a/src/body.cpp
+++ b/src/body.cpp
@@ -153,7 +153,10 @@ void body::parse(const string& buffer, const string::size_type position,
if (pos != string::npos && pos < end)
{
- m_prologText = string(buffer.begin() + position, buffer.begin() + pos);
+ vmime::text text;
+ text.parse(buffer, position, pos);
+
+ m_prologText = text.getWholeBuffer();
}
for (int index = 0 ; !lastPart && (pos != string::npos) && (pos < end) ; ++index)
@@ -246,7 +249,10 @@ void body::parse(const string& buffer, const string::size_type position,
// Treat remaining text as epilog
else if (partStart < end)
{
- m_epilogText = string(buffer.begin() + partStart, buffer.begin() + end);
+ vmime::text text;
+ text.parse(buffer, partStart, end);
+
+ m_epilogText = text.getWholeBuffer();
}
}
// Treat the contents as 'simple' data
@@ -333,7 +339,7 @@ void body::generate(utility::outputStream& os, const string::size_type maxLineLe
if (!prologText.empty())
{
- text prolog(word(prologText, getCharset()));
+ text prolog(prologText, vmime::charset("us-ascii"));
prolog.encodeAndFold(os, maxLineLength, 0,
NULL, text::FORCE_NO_ENCODING | text::NO_NEW_LINE_SEQUENCE);
@@ -356,7 +362,7 @@ void body::generate(utility::outputStream& os, const string::size_type maxLineLe
if (!epilogText.empty())
{
- text epilog(word(epilogText, getCharset()));
+ text epilog(epilogText, vmime::charset("us-ascii"));
epilog.encodeAndFold(os, maxLineLength, 0,
NULL, text::FORCE_NO_ENCODING | text::NO_NEW_LINE_SEQUENCE);
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: