changeset 21142:572ab8899bbc

lib-index: Make sure an already-corrupted index/log isn't written
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 17 Nov 2016 17:13:09 +0200
parents 10e1f8d0d80f
children aeb2d1f53ae5
files src/lib-index/mail-index-write.c src/lib-index/mail-transaction-log-file.c
diffstat 2 files changed, 11 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-write.c	Thu Nov 17 02:48:20 2016 +0200
+++ b/src/lib-index/mail-index-write.c	Thu Nov 17 17:13:09 2016 +0200
@@ -67,6 +67,8 @@
 
 	i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
 	i_assert(map->hdr.indexid == index->indexid);
+	i_assert((map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) == 0);
+	i_assert(index->indexid != 0);
 
 	fd = mail_index_create_tmp_file(index, index->filepath, &path);
 	if (fd == -1)
--- a/src/lib-index/mail-transaction-log-file.c	Thu Nov 17 02:48:20 2016 +0200
+++ b/src/lib-index/mail-transaction-log-file.c	Thu Nov 17 17:13:09 2016 +0200
@@ -220,6 +220,8 @@
 	struct mail_index *index = log->index;
 	struct mail_transaction_log_file *file;
 
+	i_assert(index->indexid != 0);
+
 	memset(hdr, 0, sizeof(*hdr));
 	hdr->major_version = MAIL_TRANSACTION_LOG_MAJOR_VERSION;
 	hdr->minor_version = MAIL_TRANSACTION_LOG_MINOR_VERSION;
@@ -846,6 +848,13 @@
 		return -1;
 	}
 
+	if (index->indexid == 0) {
+		mail_index_set_error(index,
+			"Can't create log file %s: Index is marked corrupted",
+			file->filepath);
+		return -1;
+	}
+
 	mail_transaction_log_get_dotlock_set(file->log, &new_dotlock_set);
 	new_dotlock_set.lock_suffix = LOG_NEW_DOTLOCK_SUFFIX;