]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: message-snippet - Do not stop on first non-text part
authorAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 28 Jan 2021 14:48:05 +0000 (16:48 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 4 Feb 2021 11:23:09 +0000 (13:23 +0200)
Some mail structures would break snippet generation because
the code would stop on multipart.

src/lib-mail/message-snippet.c

index 4be6233c29127ce6f41639b29d88ba01c992fa94..4cd55f16c733350f0ff9c86c1512b33dbab449b9 100644 (file)
@@ -140,6 +140,7 @@ int message_snippet_generate(struct istream *input,
        const struct message_parser_settings parser_set = { .flags = 0 };
        struct message_parser_ctx *parser;
        struct message_part *parts;
+       struct message_part *skip_part = NULL;
        struct message_decoder_context *decoder;
        struct message_block raw_block, block;
        struct snippet_context ctx;
@@ -155,6 +156,8 @@ int message_snippet_generate(struct istream *input,
        parser = message_parser_init(pool_datastack_create(), input, &parser_set);
        decoder = message_decoder_init(NULL, 0);
        while ((ret = message_parser_parse_next_block(parser, &raw_block)) > 0) {
+               if (raw_block.part == skip_part)
+                       continue;
                if (!message_decoder_decode_next_block(decoder, &raw_block, &block))
                        continue;
                if (block.size == 0) {
@@ -163,6 +166,8 @@ int message_snippet_generate(struct istream *input,
                        if (block.hdr != NULL)
                                continue;
 
+                       skip_part = NULL;
+
                        /* end of headers - verify that we can use this
                           Content-Type. we get here only once, because we
                           always handle only one non-multipart MIME part. */
@@ -177,10 +182,8 @@ int message_snippet_generate(struct istream *input,
                                                buffer_create_dynamic(pool, 1024);
                                }
                        } else if (strncasecmp(ct, "text/", 5) != 0)
-                               break;
-                       continue;
-               }
-               if (!snippet_generate(&ctx, block.data, block.size))
+                               skip_part = raw_block.part;
+               } else if (!snippet_generate(&ctx, block.data, block.size))
                        break;
        }
        i_assert(ret != 0);