From: Timo Sirainen Date: Sat, 16 Jun 2018 12:09:53 +0000 (+0300) Subject: imapc: Fix assert-crash when reconnecting expunges newly added messages X-Git-Tag: 2.3.9~1705 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=264107ab3aa4d20d2d34e78be4153c8462f4fd12;p=thirdparty%2Fdovecot%2Fcore.git imapc: Fix assert-crash when reconnecting expunges newly added messages The initial FETCH 1:* during reconnection may notice some messages that are missing and tries to expunge them. But those messages could still be in delayed_sync_trans, and currently lib-index doesn't support expunging anything but the latest mail from a transaction. Fixes: Panic: file mail-index-transaction-update.c: line 337 (mail_index_expunge_last_append): assertion failed: (seq == t->last_new_seq) --- diff --git a/src/lib-storage/index/imapc/imapc-mailbox.c b/src/lib-storage/index/imapc/imapc-mailbox.c index e27880387a..f69fe983b3 100644 --- a/src/lib-storage/index/imapc/imapc-mailbox.c +++ b/src/lib-storage/index/imapc/imapc-mailbox.c @@ -199,7 +199,7 @@ imapc_mailbox_fetch_state_finish(struct imapc_mailbox *mbox) that our IMAP connection hasn't seen yet */ break; } - mail_index_expunge(mbox->delayed_sync_trans, lseq); + imapc_mailbox_index_expunge(mbox, uid); } mbox->sync_next_lseq = 0; @@ -560,8 +560,9 @@ static void imapc_untagged_fetch(const struct imapc_untagged_reply *reply, /* we're doing the initial full sync of mails. expunge any mails that no longer exist. */ while (mbox->sync_next_lseq < lseq) { - mail_index_expunge(mbox->delayed_sync_trans, - mbox->sync_next_lseq); + mail_index_lookup_uid(mbox->delayed_sync_view, + mbox->sync_next_lseq, &uid); + imapc_mailbox_index_expunge(mbox, uid); mbox->sync_next_lseq++; } i_assert(lseq == mbox->sync_next_lseq);