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) {