From: Timo Sirainen Date: Mon, 18 Mar 2019 13:34:10 +0000 (+0200) Subject: lib-mail: istream-header-filter: Fix HEADER_FILTER_ADD_MISSING_EOH with callback X-Git-Tag: 2.3.8~22 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a30f3a4ce17a477da4b6bca865ec16a20157eedd;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: istream-header-filter: Fix HEADER_FILTER_ADD_MISSING_EOH with callback If mail already had EOH and callback returned matched=TRUE in the EOH callback (e.g. adding more headers), the callback was called a second time for the EOH. Currently there doesn't seem to be any existing code that was affected by this bug. --- diff --git a/src/lib-mail/istream-header-filter.c b/src/lib-mail/istream-header-filter.c index 77f44f6396..cc8eef8128 100644 --- a/src/lib-mail/istream-header-filter.c +++ b/src/lib-mail/istream-header-filter.c @@ -211,7 +211,6 @@ static ssize_t read_header(struct header_filter_istream *mstream) } if (matched) { - mstream->seen_eoh = FALSE; mstream->eoh_not_matched = TRUE; continue; } diff --git a/src/lib-mail/test-istream-header-filter.c b/src/lib-mail/test-istream-header-filter.c index 1c20e11142..3eb66d6108 100644 --- a/src/lib-mail/test-istream-header-filter.c +++ b/src/lib-mail/test-istream-header-filter.c @@ -527,19 +527,30 @@ static void test_istream_add_missing_eoh(void) static void test_istream_add_missing_eoh_and_edit(void) { - const char *input = "From: foo\nTo: bar\n"; - const char *output = "From: foo\nTo: 123\nAdded: header\n\n"; + static const struct { + const char *input; + const char *output; + } tests[] = { + { "From: foo\nTo: bar\n", + "From: foo\nTo: 123\nAdded: header\n\n" }, + { "From: foo\nTo: bar\n\n", + "From: foo\nTo: 123\nAdded: header\n\n" }, + { "From: foo\nTo: bar\n\nbody\n", + "From: foo\nTo: 123\nAdded: header\n\nbody\n" }, + }; struct istream *istream; + unsigned int i; test_begin("i_stream_create_header_filter: add missing EOH and edit headers"); - istream = test_istream_create(input); - test_istream_run(istream, strlen(input), output, - HEADER_FILTER_EXCLUDE | - HEADER_FILTER_ADD_MISSING_EOH | - HEADER_FILTER_NO_CR, - edit_callback); - i_stream_unref(&istream); - + for (i = 0; i < N_ELEMENTS(tests); i++) { + istream = test_istream_create(tests[i].input); + test_istream_run(istream, strlen(tests[i].input), tests[i].output, + HEADER_FILTER_EXCLUDE | + HEADER_FILTER_ADD_MISSING_EOH | + HEADER_FILTER_NO_CR, + edit_callback); + i_stream_unref(&istream); + } test_end(); }