From: Timo Sirainen Date: Sat, 16 Jun 2018 16:40:34 +0000 (+0300) Subject: imapc: Fix assert-crash if syncing adds delayed expunges, but fails afterwards X-Git-Tag: 2.3.3.rc1~249 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a20890a448caeabb08bd204d7ac1b143a28ed54;p=thirdparty%2Fdovecot%2Fcore.git 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)) --- diff --git a/src/lib-storage/index/imapc/imapc-sync.c b/src/lib-storage/index/imapc/imapc-sync.c index 5941d66c50..5ac48f3856 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,