From: Timo Sirainen Date: Tue, 27 Dec 2022 10:00:45 +0000 (-0500) Subject: lib-mail: message-[header-]parser - Call callbacks in their own data stack frames X-Git-Tag: 2.4.0~3230 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d825a5ef2ecc411e41ea0af9dc7fcd5b555d2b9f;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: message-[header-]parser - Call callbacks in their own data stack frames This makes sure the data stack memory usage won't grow too much while parsing a large number of headers. --- diff --git a/src/lib-mail/message-header-parser.c b/src/lib-mail/message-header-parser.c index c5026f1bb7..8e8d01347d 100644 --- a/src/lib-mail/message-header-parser.c +++ b/src/lib-mail/message-header-parser.c @@ -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, diff --git a/src/lib-mail/message-parser.c b/src/lib-mail/message-parser.c index 4015cd0e62..be88dabd4d 100644 --- a/src/lib-mail/message-parser.c +++ b/src/lib-mail/message-parser.c @@ -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); }