Mercurial > dovecot > core-2.2
changeset 22059:b6ec79a3d312
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.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Wed, 17 May 2017 13:31:09 +0300 |
parents | 57e28dbf5bc1 |
children | dc04a912eb35 |
files | src/lib-index/mail-transaction-log-view.c |
diffstat | 1 files changed, 12 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-transaction-log-view.c Thu May 18 23:13:38 2017 +0300 +++ b/src/lib-index/mail-transaction-log-view.c Wed May 17 13:31:09 2017 +0300 @@ -349,6 +349,7 @@ { 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 @@ 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) {