# HG changeset patch # User Josef 'Jeff' Sipek # Date 1524521751 14400 # Node ID e48f732f0f39fba128e656180191103046b9f423 # Parent d5b44ec763b0f326b960c59e6d52c38e2ce41877 mdbox: Assume that empty uid maps found during sync are harmless Instead of failing the sync and causing index rebuild, just skip over the empty uid maps. Chances are that they these records came from various plugins that create fake mails. diff -r d5b44ec763b0 -r e48f732f0f39 src/lib-storage/index/dbox-multi/mdbox-sync.c --- a/src/lib-storage/index/dbox-multi/mdbox-sync.c Tue Dec 12 21:36:07 2017 +0200 +++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c Mon Apr 23 18:15:51 2018 -0400 @@ -23,6 +23,7 @@ #include "mdbox-sync.h" +/* returns -1 on error, 1 on success, 0 if guid is empty/missing */ static int dbox_sync_verify_expunge_guid(struct mdbox_sync_context *ctx, uint32_t seq, const guid_128_t guid_128) @@ -33,9 +34,13 @@ mail_index_lookup_uid(ctx->sync_view, seq, &uid); mail_index_lookup_ext(ctx->sync_view, seq, ctx->mbox->guid_ext_id, &data, NULL); + + if ((data == NULL) || guid_128_is_empty(data)) + return 0; + if (guid_128_is_empty(guid_128) || memcmp(data, guid_128, GUID_128_SIZE) == 0) - return 0; + return 1; mail_storage_set_critical(&ctx->mbox->storage->storage.storage, "Mailbox %s: Expunged GUID mismatch for UID %u: %s vs %s", @@ -49,14 +54,16 @@ const guid_128_t guid_128) { uint32_t map_uid; + int ret; if (seq_range_array_add(&ctx->expunged_seqs, seq)) { /* already marked as expunged in this sync */ return 0; } - if (dbox_sync_verify_expunge_guid(ctx, seq, guid_128) < 0) - return -1; + ret = dbox_sync_verify_expunge_guid(ctx, seq, guid_128); + if (ret <= 0) + return ret; if (mdbox_mail_lookup(ctx->mbox, ctx->sync_view, seq, &map_uid) < 0) return -1; if (mdbox_map_update_refcount(ctx->map_trans, map_uid, -1) < 0) @@ -107,7 +114,10 @@ mail_index_lookup_uid(ctx->sync_view, seq, &uid); mail_index_lookup_ext(ctx->sync_view, seq, ctx->mbox->guid_ext_id, &data, NULL); - mail_index_expunge_guid(trans, seq, data); + if ((data == NULL) || guid_128_is_empty(data)) + mail_index_expunge(trans, seq); + else + mail_index_expunge_guid(trans, seq, data); } if (mail_index_transaction_commit(&trans) < 0) return -1;