]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: message-[header-]parser - Call callbacks in their own data stack frames
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 27 Dec 2022 10:00:45 +0000 (05:00 -0500)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 11 Jan 2023 21:50:37 +0000 (23:50 +0200)
This makes sure the data stack memory usage won't grow too much while
parsing a large number of headers.

src/lib-mail/message-header-parser.c
src/lib-mail/message-parser.c

index c5026f1bb72d63edf07927c66f7ad58be2ae551c..8e8d01347dda8f1cef2435da6d0cabae34f07a07 100644 (file)
@@ -405,13 +405,16 @@ void message_parse_header(struct istream *input, struct message_size *hdr_size,
        int ret;
 
        hdr_ctx = message_parse_header_init(input, hdr_size, flags);
-       while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0)
+       while ((ret = message_parse_header_next(hdr_ctx, &hdr)) > 0) T_BEGIN {
                callback(hdr, context);
+       } T_END;
        i_assert(ret != 0);
        message_parse_header_deinit(&hdr_ctx);
 
        /* call after the final skipping */
-       callback(NULL, context);
+       T_BEGIN {
+               callback(NULL, context);
+       } T_END;
 }
 
 void message_header_line_write(buffer_t *output,
index 4015cd0e624c760e79d229b16596b87e731f63c6..be88dabd4dfb5e929e424265c649cb1deee64239 100644 (file)
@@ -874,7 +874,9 @@ void message_parser_parse_header(struct message_parser_ctx *ctx,
        int ret;
 
        while ((ret = message_parser_parse_next_block(ctx, &block)) > 0) {
-               callback(block.part, block.hdr, context);
+               T_BEGIN {
+                       callback(block.part, block.hdr, context);
+               } T_END;
 
                if (block.hdr == NULL)
                        break;
@@ -882,10 +884,10 @@ void message_parser_parse_header(struct message_parser_ctx *ctx,
        i_assert(ret != 0);
        i_assert(ctx->part != NULL);
 
-       if (ret < 0) {
+       if (ret < 0) T_BEGIN {
                /* well, can't return error so fake end of headers */
                callback(ctx->part, NULL, context);
-       }
+       } T_END;
 
         *hdr_size = ctx->part->header_size;
 }
@@ -899,8 +901,9 @@ void message_parser_parse_body(struct message_parser_ctx *ctx,
        int ret;
 
        while ((ret = message_parser_parse_next_block(ctx, &block)) > 0) {
-               if (block.size == 0 && hdr_callback != NULL)
+               if (block.size == 0 && hdr_callback != NULL) T_BEGIN {
                        hdr_callback(block.part, block.hdr, context);
+               } T_END;
        }
        i_assert(ret != 0);
 }