From: Timo Sirainen Date: Wed, 17 May 2017 10:31:09 +0000 (+0300) Subject: lib-index: mail_transaction_log_view_set_all() - don't entirely ignore corrupted... X-Git-Tag: 2.2.30.rc1~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f71db30113869c875ab579b50d9d6a893dccd700;p=thirdparty%2Fdovecot%2Fcore.git lib-index: mail_transaction_log_view_set_all() - don't entirely ignore corrupted logs Ignore them only if it's followed by an index reset. --- diff --git a/src/lib-index/mail-transaction-log-view.c b/src/lib-index/mail-transaction-log-view.c index 4837b5eaea..b5581c8881 100644 --- a/src/lib-index/mail-transaction-log-view.c +++ b/src/lib-index/mail-transaction-log-view.c @@ -349,6 +349,7 @@ int mail_transaction_log_view_set_all(struct mail_transaction_log_view *view) { struct mail_transaction_log_file *file, *first; const char *reason; + int ret; /* make sure .log.2 file is opened */ (void)mail_transaction_log_find_file(view->log, 1, FALSE, &file, &reason); @@ -357,14 +358,22 @@ int mail_transaction_log_view_set_all(struct mail_transaction_log_view *view) i_assert(first != NULL); for (file = view->log->files; file != NULL; file = file->next) { - if (mail_transaction_log_file_map(file, file->hdr.hdr_size, - (uoff_t)-1) < 0) + ret = mail_transaction_log_file_map(file, file->hdr.hdr_size, + (uoff_t)-1); + if (ret < 0) return -1; - if (file->hdr.prev_file_seq == 0) { + if (ret == 0) { + /* corrupted */ + first = NULL; + } else if (file->hdr.prev_file_seq == 0) { /* this file resets the index. skip the old ones. */ first = file; } } + if (first == NULL) { + /* index wasn't reset after corruption was found */ + return -1; + } mail_transaction_log_view_unref_all(view); for (file = first; file != NULL; file = file->next) {