From: Timo Sirainen Date: Mon, 18 Mar 2013 13:46:16 +0000 (+0200) Subject: quoted-printable decoding: Don't add CR if it wasn't in input. X-Git-Tag: 2.2.rc3~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5ecc28acbbacfc462452ddfa8f58e7f05d01ea0;p=thirdparty%2Fdovecot%2Fcore.git quoted-printable decoding: Don't add CR if it wasn't in input. This guarantees that the decoded Q-P won't be larger than its input. --- diff --git a/src/lib-mail/quoted-printable.c b/src/lib-mail/quoted-printable.c index 342ebce2ed..8ecfa58d3d 100644 --- a/src/lib-mail/quoted-printable.c +++ b/src/lib-mail/quoted-printable.c @@ -33,7 +33,7 @@ quoted_printable_decode_full(const unsigned char *src, size_t src_size, { char hexbuf[3]; size_t src_pos, pos, next; - bool errors = FALSE; + bool have_cr, errors = FALSE; int ret; hexbuf[2] = '\0'; @@ -46,13 +46,19 @@ quoted_printable_decode_full(const unsigned char *src, size_t src_size, if (src[src_pos] == '\n') { /* drop trailing whitespace */ pos = src_pos; - if (pos > 0 && src[pos-1] == '\r') + if (pos > 0 && src[pos-1] == '\r') { pos--; + have_cr = TRUE; + } else { + have_cr = FALSE; + } while (pos > 0 && QP_IS_TRAILING_SPACE(src[pos-1])) pos--; buffer_append(dest, src + next, pos - next); next = src_pos+1; - buffer_append(dest, "\r\n", 2); + if (have_cr) + buffer_append_c(dest, '\r'); + buffer_append_c(dest, '\n'); continue; } diff --git a/src/lib-mail/test-quoted-printable.c b/src/lib-mail/test-quoted-printable.c index a6f7824869..8adf1dcd41 100644 --- a/src/lib-mail/test-quoted-printable.c +++ b/src/lib-mail/test-quoted-printable.c @@ -21,7 +21,7 @@ static void test_quoted_printable_decode(void) { "foo = \n=01", "foo \001", 0, 0 }, { "foo =\t\r\nbar", "foo bar", 0, 0 }, { "foo =\r\n=01", "foo \001", 0, 0 }, - { "foo \nbar=", "foo\r\nbar", 1, 0 }, + { "foo \nbar=", "foo\nbar", 1, 0 }, { "=0A=0D ", "\n\r", 2, 0 }, { "foo_bar", "foo_bar", 0, 0 }, { "foo=", "foo", 1, 0 },