]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Do not crash if log is missing
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 21 Nov 2016 11:33:42 +0000 (13:33 +0200)
committerGitLab <gitlab@git.dovecot.net>
Mon, 21 Nov 2016 20:34:09 +0000 (22:34 +0200)
Fixes sigfault when index and index.log files are
corrupted.

src/lib-index/mail-index.c
src/lib-index/mail-transaction-log-view.c

index 12997ba4ba4c9a573ca75973c7378643283e7422..fb404007dc5d1a9ef6767552328a3b9ce8e2aa2b 100644 (file)
@@ -17,6 +17,7 @@
 #include "mail-index-sync-private.h"
 #include "mail-index-modseq.h"
 #include "mail-transaction-log.h"
+#include "mail-transaction-log-view-private.h"
 #include "mail-cache.h"
 
 #include <stdio.h>
@@ -600,8 +601,16 @@ int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags)
                mail_index_close_nonopened(index);
                return ret;
        }
+
        index->open_count++;
 
+       if (index->log->head == NULL) {
+               mail_index_close(index);
+               mail_index_set_error(index, "Index is corrupted "
+                                           "(log->view->head == NULL)");
+               return -1;
+       }
+
        i_assert(index->map != NULL);
        mail_index_alloc_cache_index_opened(index);
        return 1;
index 5c0b5bd3b6703be52007b33db17cc423624363ee..0f6a07fa9d6aa62759dd62fc91fb5f152c51a543 100644 (file)
@@ -15,6 +15,8 @@ mail_transaction_log_view_open(struct mail_transaction_log *log)
        view->log = log;
        view->broken = TRUE;
 
+       i_assert(view->log->head != NULL);
+
        view->head = view->tail = view->log->head;
        view->head->refcount++;
        i_array_init(&view->file_refs, 8);