From: Timo Sirainen Date: Thu, 19 Aug 2021 10:50:04 +0000 (+0200) Subject: lib-storage: Make sure header parsing is deinitialized after failures X-Git-Tag: 2.3.17~162 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5280904733382a9b175fba43c33718942ab0f5a4;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Make sure header parsing is deinitialized after failures This should fix all the possible reasons for: Panic: file index-mail-headers.c: line 198 (index_mail_parse_header_init): assertion failed: (!mail->data.header_parser_initialized) --- diff --git a/src/lib-storage/index/index-mail-headers.c b/src/lib-storage/index/index-mail-headers.c index 59f1e6bbde..365cac1eea 100644 --- a/src/lib-storage/index/index-mail-headers.c +++ b/src/lib-storage/index/index-mail-headers.c @@ -34,7 +34,7 @@ static int header_line_cmp(const struct index_mail_line *l1, (int)l1->line_num - (int)l2->line_num; } -static void index_mail_parse_header_deinit(struct index_mail *mail) +void index_mail_parse_header_deinit(struct index_mail *mail) { mail->data.header_parser_initialized = FALSE; } @@ -473,8 +473,11 @@ int index_mail_parse_headers_internal(struct index_mail *mail, msg_parser_set.hdr_flags, index_mail_parse_header_cb, mail); } - if (index_mail_stream_check_failure(mail) < 0) + if (index_mail_stream_check_failure(mail) < 0) { + index_mail_parse_header_deinit(mail); return -1; + } + i_assert(!mail->data.header_parser_initialized); data->hdr_size_set = TRUE; data->access_part &= ENUM_NEGATE(PARSE_HDR); return 0; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index f21c155d6e..329f9e7f37 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1195,8 +1195,15 @@ index_mail_parse_body_finish(struct index_mail *mail, mail->data.parsed_bodystructure = FALSE; if (mail->data.save_bodystructure_body) mail->data.save_bodystructure_header = TRUE; + if (mail->data.header_parser_initialized) + index_mail_parse_header_deinit(mail); return -1; } + if (mail->data.header_parser_initialized) { + i_assert(!success); + index_mail_parse_header_deinit(mail); + } + if (mail->data.save_bodystructure_body) { mail->data.parsed_bodystructure = TRUE; mail->data.save_bodystructure_header = FALSE; @@ -2329,6 +2336,7 @@ void index_mail_cache_parse_deinit(struct mail *_mail, time_t received_date, if (mail->data.parser_ctx == NULL) { /* we didn't even start cache parsing */ + i_assert(!mail->data.header_parser_initialized); return; } } diff --git a/src/lib-storage/index/index-mail.h b/src/lib-storage/index/index-mail.h index 57f213ff0e..6e1b7da7fa 100644 --- a/src/lib-storage/index/index-mail.h +++ b/src/lib-storage/index/index-mail.h @@ -198,6 +198,7 @@ int index_mail_parse_headers(struct index_mail *mail, struct mailbox_header_lookup_ctx *headers, const char *reason) ATTR_NULL(2); +void index_mail_parse_header_deinit(struct index_mail *mail); /* Same as index_mail_parse_headers(), but assume that the stream is already opened. */ int index_mail_parse_headers_internal(struct index_mail *mail,