]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
quoted-printable decoding didn't handle QP after soft line breaks correctly.
authorTimo Sirainen <tss@iki.fi>
Thu, 10 Sep 2009 23:13:19 +0000 (19:13 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 10 Sep 2009 23:13:19 +0000 (19:13 -0400)
Patch by Yamazaki Hideto.

--HG--
branch : HEAD

src/lib-mail/quoted-printable.c
src/lib-mail/test-quoted-printable.c

index a9b120226454dd800cbc81c2ad35fc2b6c72d909..e9809bc884a02221564253892cfeb0955a6171a0 100644 (file)
@@ -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;
                }
index 1e23d986f2b922b2d18c9c56030fc6acad1d2e22..21bce171d3bf66746d34e830bc77dcedcda34e34 100644 (file)
@@ -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();