You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by "Frederik Lindberg (JIRA)" <ji...@apache.org> on 2011/09/20 15:48:10 UTC

[jira] [Created] (GERONIMO-6165) Soft linebreaks in quoted-printable body result in loss of first character on next line

Soft linebreaks in quoted-printable body result in loss of first character on next line
---------------------------------------------------------------------------------------

                 Key: GERONIMO-6165
                 URL: https://issues.apache.org/jira/browse/GERONIMO-6165
             Project: Geronimo
          Issue Type: Bug
      Security Level: public (Regular issues)
          Components: mail
    Affects Versions: 2.1
         Environment: Google Appengine
            Reporter: Frederik Lindberg


http://code.google.com/p/googleappengine/issues/detail?id=2675

When emails with quoted-printable body and soft linebreaks are processed, the first character after the soft break disappears, eg:

hello th=
ere!

becomes
hello thre!

This is due to geronimo/mail/util/QuotedPrintableEncoder.java (current trunk: Revision 1173142) public int decode(byte[] data, int off, int length, OutputStream out) throws IOException incorrectly looking for a line ending as "\r\n", whereas at this point line ending are "\n". So, the code:

            else if (ch == '=') {
                // we found an encoded character.  Reduce the 3 char sequence to one.
                // but first, make sure we have two characters to work with.
                if (off + 1 >= endOffset) {
                    throw new IOException("Invalid quoted printable encoding");
                }
                // convert the two bytes back from hex.
                byte b1 = data[off++];
                byte b2 = data[off++];

                // we've found an encoded carriage return.  The next char needs to be a newline
                if (b1 == '\r') {
                    if (b2 != '\n') {
                        throw new IOException("Invalid quoted printable encoding");
                    }
                    // this was a soft linebreak inserted by the encoding.  We just toss this away
                    // on decode.
                }
                else {

does not recognize the line ending and instead takes '=' + '\n' + {next char} and looks it up as a QP byte (which just becomes 0x00 via decodingTable without any Exceptions).

I believe the code should be:

    else if (ch == '=') {

if (off >= endOffset) {

    throw new IOException("Invalid quoted printable encoding");

}
byte b1 = data[off++];
if (b1 == '\n') {

    // do nothing, this is a soft linebreak

} else {

    if (off >= endOffset) {

        throw new IOException("Invalid quoted printable encoding");

    }
    b2 = data[off++];
    out.write((b1 << 4) | b2);

            // 3 bytes in, one byte out

    bytesWritten++;

}

Thanks!


Fred


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira