]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fix assert-crash when reconnecting expunges newly added messages
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 16 Jun 2018 12:09:53 +0000 (15:09 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 26 Jun 2018 08:28:55 +0000 (11:28 +0300)
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)

src/lib-storage/index/imapc/imapc-mailbox.c

index ca01841d723d3cd6be14833d6181a96d62b13321..2763eb276bde0c03a2d36720daceb08c2ac673bf 100644 (file)
@@ -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);