]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fix assert-crash if syncing adds delayed expunges, but fails afterwards
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 16 Jun 2018 16:40:34 +0000 (19:40 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 26 Jun 2018 08:29:23 +0000 (11:29 +0300)
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

index 5941d66c50198a2a9ce829648d2ddd538aec7557..5ac48f38560231ad4c2be1a7aeec13c8a8dac728 100644 (file)
@@ -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,