You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by "Hendrik Saly (JIRA)" <ji...@apache.org> on 2014/11/25 21:21:12 UTC

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

     [ https://issues.apache.org/jira/browse/GERONIMO-6165?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Hendrik Saly resolved GERONIMO-6165.
------------------------------------
    Resolution: Fixed

Resolved with rev 1641681

> 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
>            Assignee: Hendrik Saly
>
> 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 was sent by Atlassian JIRA
(v6.3.4#6332)