]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: If message header has no colon, store it as value only
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 2 Sep 2021 14:12:55 +0000 (17:12 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 27 Sep 2021 07:01:18 +0000 (07:01 +0000)
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.

src/lib-mail/message-header-parser.c
src/lib-mail/test-message-header-parser.c
src/plugins/pop3-migration/pop3-migration-plugin.c

index c45c63505e2431073a93cebe9cfa7068a3e80e9d..80210d2269522be98f78dc4d898ac4095f89eb26 100644 (file)
@@ -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;
index 025868a63cf1e667d9d753d6604dfe6efe1b5e89..58cb7f5577407b6d2fa90aeaa54c264d23e886be 100644 (file)
@@ -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);
index d04e107cb92ac2a70de831190824dc2451064975..e21e526d946516da2a81358e86a14db2c9cd0ee4 100644 (file)
@@ -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. */