]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Make sure header parsing is deinitialized after failures
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 19 Aug 2021 10:50:04 +0000 (12:50 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 1 Sep 2021 09:09:05 +0000 (12:09 +0300)
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)

src/lib-storage/index/index-mail-headers.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/index-mail.h

index 59f1e6bbde6f41990e78e89ef8526fc390477e79..365cac1eea5697ec4abb45bb5d9f8eab1494b749 100644 (file)
@@ -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;
index f21c155d6eaa9ee0b09f3e66f1ebccd6610f43f5..329f9e7f37aec601f87b6eb72c3fdeefd4d05155 100644 (file)
@@ -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;
                }
        }
index 57f213ff0e1e271dec8ebe7027118412a6d24f7a..6e1b7da7faaa9685c40b409e6045d26c4698efbc 100644 (file)
@@ -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,