diff --git a/src/lib-storage/index/dbox-multi/mdbox-sync.c b/src/lib-storage/index/dbox-multi/mdbox-sync.c index 04bc59dcd9..e41910c955 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-sync.c +++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c @@ -24,6 +24,7 @@ #include "mailbox-recent-flags.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) @@ -34,9 +35,13 @@ dbox_sync_verify_expunge_guid(struct mdbox_sync_context *ctx, uint32_t seq, 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; mailbox_set_critical(&ctx->mbox->box, "Expunged GUID mismatch for UID %u: %s vs %s", @@ -49,14 +54,16 @@ static int mdbox_sync_expunge(struct mdbox_sync_context *ctx, uint32_t seq, 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 @@ static int dbox_sync_mark_expunges(struct mdbox_sync_context *ctx) 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;