From 15ff00ae38382118c8a2d35e8ca6509af85a8987 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 16 Jun 2018 19:40:34 +0300 Subject: [PATCH] imapc: Fix assert-crash if syncing adds delayed expunges, but fails afterwards Fixes: Panic: file imapc-sync.c: line 328 (imapc_initial_sync_check): assertion failed: (mail_index_is_expunged(view, lseq) || seq_range_exists(&ctx->mbox->delayed_expunged_uids, luid)) --- src/lib-storage/index/imapc/imapc-sync.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib-storage/index/imapc/imapc-sync.c b/src/lib-storage/index/imapc/imapc-sync.c index 1ac2c552ed..373fce7029 100644 --- a/src/lib-storage/index/imapc/imapc-sync.c +++ b/src/lib-storage/index/imapc/imapc-sync.c @@ -496,13 +496,13 @@ static int imapc_sync_finish(struct imapc_sync_context **_ctx) int ret = ctx->failed ? -1 : 0; *_ctx = NULL; - if (ret == 0) { - if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) { - mailbox_set_index_error(&ctx->mbox->box); - ret = -1; - } - } else { - mail_index_sync_rollback(&ctx->index_sync_ctx); + /* Commit the transaction even if we failed. This is important, because + during the sync delayed_sync_trans points to the sync transaction. + Even if the syncing doesn't fully succeed, we don't want to lose + changes in delayed_sync_trans. */ + if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) { + mailbox_set_index_error(&ctx->mbox->box); + ret = -1; } if (ctx->mbox->sync_gmail_pop3_search_tag != NULL) { mailbox_set_critical(&ctx->mbox->box,