From 59349e3ae517d3e73eb8ceb515761843802e042d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B8=D0=BB=D1=8F=D0=BD=20=D0=9F=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=D1=83=D0=B7=D0=BE=D0=B2?= Date: Sun, 5 Nov 2023 15:58:12 +0000 Subject: [PATCH] mailbox.c:mailbox_add_dav() - return no error for already expunged messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When I call dav_reconstuct user syslog emits > dav_reconstruct_user: user FAILED Message %d no longer exists %d is literally contained in the log. dav_db.c:dav_reconstruct_user() calls dav_db.c:_dav_reconstruct_mb(): ```c case MBTYPE_CALENDAR: case MBTYPE_COLLECTION: case MBTYPE_ADDRESSBOOK: addproc = &mailbox_add_dav; … if (!r) r = addproc(mailbox); //⇔ same as mailbox_add_dav(mailbox) ``` and mailbox.c:mailbox_add_dav() calls ```c while ((msg = mailbox_iter_step(iter))) { const struct index_record *record = msg_record(msg); r = mailbox_update_dav(mailbox, NULL, record); if (r == IMAP_NO_MSGGONE) { if (record->internal_flags & FLAG_INTERNAL_EXPUNGED) { /* Already expunged */ continue; } … } } // while return r; ``` So when the last record is “gone”, mailbox_add_dav() and _dav_reconstruct_mb() return IMAP_NO_MSGGONE . Then dav_reconstruct_user() rolls back the reconstruct transaction. --- imap/mailbox.c | 1 + 1 file changed, 1 insertion(+) diff --git a/imap/mailbox.c b/imap/mailbox.c index 4d7fdc617d..52e7bd4124 100644 --- a/imap/mailbox.c +++ b/imap/mailbox.c @@ -6107,6 +6107,7 @@ EXPORTED int mailbox_add_dav(struct mailbox *mailbox) if (r == IMAP_NO_MSGGONE) { if (record->internal_flags & FLAG_INTERNAL_EXPUNGED) { /* Already expunged */ + r = 0; continue; }