From: Timo Sirainen Date: Thu, 10 Sep 2009 23:13:19 +0000 (-0400) Subject: quoted-printable decoding didn't handle QP after soft line breaks correctly. X-Git-Tag: 2.0.alpha1~128 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cdb6114bf0fbbc738744fb0e4d0233a19c69351a;p=thirdparty%2Fdovecot%2Fcore.git quoted-printable decoding didn't handle QP after soft line breaks correctly. Patch by Yamazaki Hideto. --HG-- branch : HEAD --- diff --git a/src/lib-mail/quoted-printable.c b/src/lib-mail/quoted-printable.c index a9b1202264..e9809bc884 100644 --- a/src/lib-mail/quoted-printable.c +++ b/src/lib-mail/quoted-printable.c @@ -43,7 +43,7 @@ void quoted_printable_decode(const unsigned char *src, size_t src_size, if (src[src_pos+1] == '\n') { /* =\n -> skip both */ - src_pos += 2; + src_pos++; next += 2; continue; } @@ -53,7 +53,7 @@ void quoted_printable_decode(const unsigned char *src, size_t src_size, if (src[src_pos+1] == '\r' && src[src_pos+2] == '\n') { /* =\r\n -> skip both */ - src_pos += 3; + src_pos += 2; next += 3; continue; } diff --git a/src/lib-mail/test-quoted-printable.c b/src/lib-mail/test-quoted-printable.c index 1e23d986f2..21bce171d3 100644 --- a/src/lib-mail/test-quoted-printable.c +++ b/src/lib-mail/test-quoted-printable.c @@ -6,19 +6,27 @@ #include "quoted-printable.h" #include "test-common.h" +struct test_quoted_printable_decode_data { + const char *input; + const char *output; + int end_skip; +}; + static void test_quoted_printable_decode(void) { - const char *data[] = { - "foo \r\nbar=", "foo\r\nbar", - "foo =\nbar", "foo bar", - "foo =\r\nbar", "foo bar", - "foo \nbar=", "foo\r\nbar", - "=0A=0D ", "\n\r", - "foo_bar", "foo_bar", - "foo=", "foo", - "foo=A", "foo", - "foo=Ax", "foo=Ax", - "foo=Ax=xy", "foo=Ax=xy" + static struct test_quoted_printable_decode_data data[] = { + { "foo \r\nbar=", "foo\r\nbar", 1 }, + { "foo =\nbar", "foo bar", 0 }, + { "foo =\n=01", "foo \001", 0 }, + { "foo =\r\nbar", "foo bar", 0 }, + { "foo =\r\n=01", "foo \001", 0 }, + { "foo \nbar=", "foo\r\nbar", 1 }, + { "=0A=0D ", "\n\r", 2 }, + { "foo_bar", "foo_bar", 0 }, + { "foo=", "foo", 1 }, + { "foo=A", "foo", 2 }, + { "foo=Ax", "foo=Ax", 0 }, + { "foo=Ax=xy", "foo=Ax=xy", 0 } }; buffer_t *buf; unsigned int i, start, end, len; @@ -26,10 +34,16 @@ static void test_quoted_printable_decode(void) test_begin("quoted printable decode"); buf = buffer_create_dynamic(pool_datastack_create(), 128); - for (i = 0; i < N_ELEMENTS(data); i += 2) { - len = strlen(data[i]); + for (i = 0; i < N_ELEMENTS(data); i++) { + len = strlen(data[i].input); + quoted_printable_decode((const void *)data[i].input, len, + &src_pos, buf); + test_assert(src_pos + data[i].end_skip == len); + test_assert(strcmp(data[i].output, str_c(buf)) == 0); + + buffer_set_used_size(buf, 0); for (start = 0, end = 1; end <= len; ) { - quoted_printable_decode(CONST_PTR_OFFSET(data[i], start), + quoted_printable_decode(CONST_PTR_OFFSET(data[i].input, start), end - start, &src_pos, buf); src_pos += start; start = src_pos; @@ -38,7 +52,8 @@ static void test_quoted_printable_decode(void) else end = src_pos + 1; } - test_assert(strcmp(data[i+1], str_c(buf)) == 0); + test_assert(src_pos + data[i].end_skip == len); + test_assert(strcmp(data[i].output, str_c(buf)) == 0); buffer_set_used_size(buf, 0); } test_end();