From 668087ea36302bae750c35f142416ae6798bd75d Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Mon, 1 Feb 2010 13:26:12 +0000 Subject: [PATCH] Fixed bug #2927077: account for multi-byte charsets in invalid sequence output. --- src/charsetConverter.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/charsetConverter.cpp b/src/charsetConverter.cpp index 798adf07..38b9e5ed 100644 --- a/src/charsetConverter.cpp +++ b/src/charsetConverter.cpp @@ -53,6 +53,27 @@ extern "C" } + +// Output replacement char when an invalid sequence is encountered +template +void outputInvalidChar(OUTPUT_CLASS& out, ICONV_DESC cd) +{ + const char* invalidCharIn = "?"; + size_t invalidCharInLen = 1; + + char invalidCharOutBuffer[16]; + char* invalidCharOutPtr = invalidCharOutBuffer; + size_t invalidCharOutLen = 16; + + if (iconv(cd, ICONV_HACK(&invalidCharIn), &invalidCharInLen, + &invalidCharOutPtr, &invalidCharOutLen) != static_cast (-1)) + { + out.write(invalidCharOutBuffer, 16 - invalidCharOutLen); + } +} + + + namespace vmime { @@ -121,18 +142,7 @@ void charsetConverter::convert(utility::inputStream& in, utility::outputStream& // Output a special character to indicate we don't known how to // convert the sequence at this position - const char* invalidCharIn = "?"; - size_t invalidCharInLen = 1; - - char invalidCharOutBuffer[16]; - char* invalidCharOutPtr = invalidCharOutBuffer; - size_t invalidCharOutLen = 16; - - if (iconv(cd, ICONV_HACK(&invalidCharIn), &invalidCharInLen, - &invalidCharOutPtr, &invalidCharOutLen) != static_cast (-1)) - { - out.write(invalidCharOutBuffer, 16 - invalidCharOutLen); - } + outputInvalidChar(out, cd); // Skip a byte and leave unconverted bytes in the input buffer std::copy(const_cast (inPtr + 1), inBuffer + sizeof(inBuffer), inBuffer); @@ -246,7 +256,7 @@ void charsetFilteredOutputStream::write // character and skip one byte in the invalid sequence. if (m_unconvCount >= sizeof(m_unconvBuffer)) { - m_stream.write("?", 1); + outputInvalidChar(m_stream, cd); std::copy(m_unconvBuffer + 1, m_unconvBuffer + m_unconvCount, m_unconvBuffer); @@ -369,7 +379,7 @@ void charsetFilteredOutputStream::flush() // Skip a "blocking" character if (inputConverted == 0) { - m_stream.write("?", 1); + outputInvalidChar(m_stream, cd); offset++; m_unconvCount--;