From: Aki Tuomi Date: Thu, 2 Sep 2021 14:12:55 +0000 (+0300) Subject: lib-mail: If message header has no colon, store it as value only X-Git-Tag: 2.3.17~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=44c43133a48a75828c723c51f88227ab1e4bfc58;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: If message header has no colon, store it as value only If the header is missing :, it is not valid header. Storing it as value only ensures it will be kept by mbox rewrite, but will not be processed as a header. --- diff --git a/src/lib-mail/message-header-parser.c b/src/lib-mail/message-header-parser.c index c45c63505e..80210d2269 100644 --- a/src/lib-mail/message-header-parser.c +++ b/src/lib-mail/message-header-parser.c @@ -4,6 +4,7 @@ #include "buffer.h" #include "istream.h" #include "str.h" +#include "strfuncs.h" #include "unichar.h" #include "message-size.h" #include "message-header-parser.h" @@ -262,16 +263,15 @@ int message_parse_header_next(struct message_header_parser_ctx *ctx, line->value = msg; line->value_len = size; } else if (colon_pos == UINT_MAX) { - /* missing ':', assume the whole line is name */ - line->value = NULL; - line->value_len = 0; + /* missing ':', assume the whole line is value */ + line->value = msg; + line->value_len = size; + line->full_value_offset = line->name_offset; - str_truncate(ctx->name, 0); - buffer_append(ctx->name, msg, size); - line->name = str_c(ctx->name); - line->name_len = str_len(ctx->name); + line->name = ""; + line->name_len = 0; - line->middle = NULL; + line->middle = uchar_empty_ptr; line->middle_len = 0; } else { size_t pos; diff --git a/src/lib-mail/test-message-header-parser.c b/src/lib-mail/test-message-header-parser.c index 025868a63c..58cb7f5577 100644 --- a/src/lib-mail/test-message-header-parser.c +++ b/src/lib-mail/test-message-header-parser.c @@ -282,8 +282,10 @@ static void test_message_header_parser_extra_cr_in_eoh(void) test_assert(message_parse_header_next(parser, &hdr) > 0 && strcmp(hdr->name, "a") == 0); test_assert(message_parse_header_next(parser, &hdr) > 0 && - strcmp(hdr->name, "\r") == 0 && hdr->middle_len == 0 && - hdr->value_len == 0 && !hdr->eoh); + *hdr->value == '\r' && hdr->value_len == 1 && + hdr->full_value_offset == 4 && + hdr->middle_len == 0 && + hdr->name_len == 0 && !hdr->eoh); test_assert(message_parse_header_next(parser, &hdr) < 0); message_parse_header_deinit(&parser); test_assert(input->stream_errno == 0); diff --git a/src/plugins/pop3-migration/pop3-migration-plugin.c b/src/plugins/pop3-migration/pop3-migration-plugin.c index d04e107cb9..e21e526d94 100644 --- a/src/plugins/pop3-migration/pop3-migration-plugin.c +++ b/src/plugins/pop3-migration/pop3-migration-plugin.c @@ -181,7 +181,8 @@ pop3_header_filter_callback(struct header_filter_istream *input ATTR_UNUSED, if (ctx->stop) *matched = TRUE; } else { - if (strspn(hdr->name, "\r") == hdr->name_len) { + if (hdr->value_len > 0 && hdr->middle_len == 0 && hdr->name_len == 0 && + i_memspn(hdr->value, hdr->value_len, "\r", 1U) == hdr->value_len) { /* CR+CR+LF - some servers stop the header processing here while others don't. To make sure they can be matched correctly we want to stop here entirely. */