From: Timo Sirainen Date: Tue, 19 Jun 2018 09:33:49 +0000 (+0300) Subject: imapc: Fix handling UIDVALIDITY changes X-Git-Tag: 2.3.2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb05284d76c751fc4edbba84cda0279c714f5f8c;p=thirdparty%2Fdovecot%2Fcore.git imapc: Fix handling UIDVALIDITY changes Index was being correctly reset, but the transaction was rolled back. --- diff --git a/src/lib-storage/index/imapc/imapc-mailbox.c b/src/lib-storage/index/imapc/imapc-mailbox.c index 0a1bb6e0fa..a023e3f70e 100644 --- a/src/lib-storage/index/imapc/imapc-mailbox.c +++ b/src/lib-storage/index/imapc/imapc-mailbox.c @@ -94,7 +94,7 @@ static int imapc_mailbox_commit_delayed_expunges(struct imapc_mailbox *mbox) } int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox, - bool *changes_r) + bool force, bool *changes_r) { int ret = 0; @@ -104,7 +104,7 @@ int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox, mail_index_view_close(&mbox->delayed_sync_view); if (mbox->delayed_sync_trans == NULL) ; - else if (!mbox->selected) { + else if (!mbox->selected && !force) { /* ignore any changes done during SELECT */ mail_index_transaction_rollback(&mbox->delayed_sync_trans); } else { @@ -744,7 +744,7 @@ static void imapc_sync_uid_validity(struct imapc_mailbox *mbox) /* The reset needs to be committed before FETCH 1:* results are received. */ bool changes; - if (imapc_mailbox_commit_delayed_trans(mbox, &changes) < 0) + if (imapc_mailbox_commit_delayed_trans(mbox, TRUE, &changes) < 0) mail_index_mark_corrupted(mbox->box.index); imapc_mailbox_init_delayed_trans(mbox); } diff --git a/src/lib-storage/index/imapc/imapc-storage.c b/src/lib-storage/index/imapc/imapc-storage.c index 4268762063..5ba9ba3ba5 100644 --- a/src/lib-storage/index/imapc/imapc-storage.c +++ b/src/lib-storage/index/imapc/imapc-storage.c @@ -788,7 +788,7 @@ static void imapc_mailbox_close(struct mailbox *box) struct imapc_mailbox *mbox = IMAPC_MAILBOX(box); bool changes; - (void)imapc_mailbox_commit_delayed_trans(mbox, &changes); + (void)imapc_mailbox_commit_delayed_trans(mbox, FALSE, &changes); imapc_mail_fetch_flush(mbox); if (mbox->client_box != NULL) imapc_client_mailbox_close(&mbox->client_box); diff --git a/src/lib-storage/index/imapc/imapc-storage.h b/src/lib-storage/index/imapc/imapc-storage.h index 85c4ee4a6d..d23a90b2d4 100644 --- a/src/lib-storage/index/imapc/imapc-storage.h +++ b/src/lib-storage/index/imapc/imapc-storage.h @@ -192,7 +192,7 @@ void imapc_simple_run(struct imapc_simple_context *sctx); void imapc_simple_callback(const struct imapc_command_reply *reply, void *context); int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox, - bool *changes_r); + bool force, bool *changes_r); void imapc_mailbox_noop(struct imapc_mailbox *mbox); void imapc_mailbox_set_corrupted(struct imapc_mailbox *mbox, const char *reason, ...) ATTR_FORMAT(2, 3); diff --git a/src/lib-storage/index/imapc/imapc-sync.c b/src/lib-storage/index/imapc/imapc-sync.c index 3db2fab132..857271edee 100644 --- a/src/lib-storage/index/imapc/imapc-sync.c +++ b/src/lib-storage/index/imapc/imapc-sync.c @@ -512,7 +512,7 @@ static int imapc_sync_finish(struct imapc_sync_context **_ctx) /* this is done simply to commit delayed expunges if there are any (has to be done after sync is committed) */ - if (imapc_mailbox_commit_delayed_trans(ctx->mbox, &changes) < 0) + if (imapc_mailbox_commit_delayed_trans(ctx->mbox, FALSE, &changes) < 0) ctx->failed = TRUE; i_free(ctx); @@ -579,7 +579,7 @@ imapc_mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) /* initial FETCH failed already */ ret = -1; } - if (imapc_mailbox_commit_delayed_trans(mbox, &changes) < 0) + if (imapc_mailbox_commit_delayed_trans(mbox, FALSE, &changes) < 0) ret = -1; if ((changes || mbox->sync_fetch_first_uid != 0 || index_mailbox_want_full_sync(&mbox->box, flags)) &&