]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Detect when message has been unexpectedly expunged from index.
authorTimo Sirainen <tss@iki.fi>
Fri, 7 Oct 2011 18:14:58 +0000 (21:14 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 7 Oct 2011 18:14:58 +0000 (21:14 +0300)
src/lib-storage/index/imapc/imapc-mailbox.c

index 6bb33c247e41c3768060d0f54b3d9f01ad3d9515..0e8d62bacedda83d1771d4434260121bbb561125 100644 (file)
@@ -229,7 +229,8 @@ imapc_mailbox_msgmap_update(struct imapc_mailbox *mbox,
                mbox->prev_skipped_uid = fetch_uid;
        } else if (fetch_uid < imapc_msgmap_uidnext(msgmap)) {
                imapc_mailbox_set_corrupted(mbox,
-                       "Expunged message reappeared (uid=%u < next_uid=%u)",
+                       "Expunged message reappeared in session "
+                       "(uid=%u < next_uid=%u)",
                        fetch_uid, imapc_msgmap_uidnext(msgmap));
                return -1;
        } else {
@@ -237,6 +238,15 @@ imapc_mailbox_msgmap_update(struct imapc_mailbox *mbox,
                imapc_msgmap_append(msgmap, rseq, uid);
                if (uid < mbox->min_append_uid) {
                        /* message is already added to index */
+                       if (!mbox->initial_sync_done &&
+                           !mail_index_lookup_seq(mbox->delayed_sync_view,
+                                                  uid, lseq_r)) {
+                               imapc_mailbox_set_corrupted(mbox,
+                                       "Expunged message reappeared "
+                                       "(uid=%u < next_uid=%u)",
+                                       uid, mbox->min_append_uid);
+                               return -1;
+                       }
                } else if (mbox->syncing) {
                        mail_index_append(mbox->delayed_sync_trans,
                                          uid, lseq_r);