From: Timo Sirainen Date: Sun, 2 May 2004 12:57:29 +0000 (+0300) Subject: Don't crash in assert() with corrupted index file. X-Git-Tag: 1.1.alpha1~4154 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed1f14af0d426b5550521a58fc414d130aa14172;p=thirdparty%2Fdovecot%2Fcore.git Don't crash in assert() with corrupted index file. --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-transaction-log-view.c b/src/lib-index/mail-transaction-log-view.c index b91c1b3dcf..2ae861b5af 100644 --- a/src/lib-index/mail-transaction-log-view.c +++ b/src/lib-index/mail-transaction-log-view.c @@ -84,8 +84,6 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view, i_assert(view->broken); i_assert(min_file_seq <= max_file_seq); - i_assert(min_file_offset >= sizeof(struct mail_transaction_log_header)); - i_assert(max_file_offset >= sizeof(struct mail_transaction_log_header)); if (view->log == NULL) return -1; @@ -118,6 +116,14 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view, max_file_offset = min_file_offset; } } + + /* check these later than others as index file may have corrupted + log_file_offset. we should have recreated the log file and + skipped min_file_seq file above.. max_file_offset can be broken + only if min_file_seq = max_file_seq. */ + i_assert(min_file_offset >= sizeof(struct mail_transaction_log_header)); + i_assert(max_file_offset >= sizeof(struct mail_transaction_log_header)); + end_offset = min_file_seq == max_file_seq ? max_file_offset : (uoff_t)-1; ret = mail_transaction_log_file_map(file, min_file_offset, end_offset); diff --git a/src/lib-index/mail-transaction-log.c b/src/lib-index/mail-transaction-log.c index 5f34130fa4..11c78199bd 100644 --- a/src/lib-index/mail-transaction-log.c +++ b/src/lib-index/mail-transaction-log.c @@ -62,10 +62,11 @@ mail_transaction_log_file_set_corrupted(struct mail_transaction_log_file *file, } #define INDEX_HAS_MISSING_LOGS(index, file) \ - ((file)->hdr.file_seq != (index)->hdr->log_file_seq && \ - ((file)->hdr.prev_file_seq != (index)->hdr->log_file_seq || \ - (file)->hdr.prev_file_offset != (index)->hdr->log_file_offset)) - + !(((file)->hdr.file_seq == (index)->hdr->log_file_seq && \ + (index)->hdr->log_file_offset >= \ + sizeof(struct mail_transaction_log_header)) || \ + ((file)->hdr.prev_file_seq == (index)->hdr->log_file_seq && \ + (file)->hdr.prev_file_offset == (index)->hdr->log_file_offset)) static int mail_transaction_log_check_file_seq(struct mail_transaction_log *log) {