Mercurial > dovecot > core-2.2
changeset 12156:c24206d083e8
maildir: Fixed expunging messages with GUIDs in uidlist.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 23 Sep 2010 16:36:00 +0100 |
parents | 75e466740c57 |
children | 4a753371ae73 |
files | src/lib-storage/index/maildir/maildir-sync-index.c |
diffstat | 1 files changed, 24 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/maildir/maildir-sync-index.c Thu Sep 23 16:06:28 2010 +0100 +++ b/src/lib-storage/index/maildir/maildir-sync-index.c Thu Sep 23 16:36:00 2010 +0100 @@ -44,27 +44,35 @@ { enum maildir_uidlist_rec_flag flags; uint8_t guid_128[MAIL_GUID_128_SIZE]; - const char *fname; uint32_t uid; mail_index_lookup_uid(ctx->view, seq, &uid); - if (maildir_uidlist_lookup(ctx->mbox->uidlist, uid, - &flags, &fname) <= 0) - memset(guid_128, 0, sizeof(guid_128)); - else T_BEGIN { - mail_generate_guid_128_hash(t_strcut(fname, ':'), - guid_128); + T_BEGIN { + const char *guid; + + guid = maildir_uidlist_lookup_ext(ctx->mbox->uidlist, uid, + MAILDIR_UIDLIST_HDR_EXT_GUID); + if (guid == NULL) { + if (maildir_uidlist_lookup(ctx->mbox->uidlist, uid, + &flags, &guid) > 0) + guid = t_strcut(guid, ':'); + } + + if (guid == NULL) + memset(guid_128, 0, sizeof(guid_128)); + else + mail_generate_guid_128_hash(guid, guid_128); } T_END; - mail_index_expunge_guid(ctx->trans, seq, guid_128); } static bool maildir_expunge_is_valid_guid(struct maildir_index_sync_context *ctx, - const char *filename, + uint32_t uid, const char *filename, uint8_t expunged_guid_128[MAIL_GUID_128_SIZE]) { uint8_t guid_128[MAIL_GUID_128_SIZE]; + const char *guid; if (mail_guid_128_is_empty(expunged_guid_128)) { /* no GUID associated with expunge */ @@ -72,8 +80,11 @@ } T_BEGIN { - mail_generate_guid_128_hash(t_strcut(filename, ':'), - guid_128); + guid = maildir_uidlist_lookup_ext(ctx->mbox->uidlist, uid, + MAILDIR_UIDLIST_HDR_EXT_GUID); + if (guid == NULL) + guid = t_strcut(filename, ':'); + mail_generate_guid_128_hash(guid, guid_128); } T_END; if (memcmp(guid_128, expunged_guid_128, sizeof(guid_128)) == 0) @@ -551,7 +562,8 @@ index_sync_changes_read(ctx->sync_changes, rec->uid, &expunged, expunged_guid_128); if (expunged) { - if (!maildir_expunge_is_valid_guid(ctx, filename, + if (!maildir_expunge_is_valid_guid(ctx, rec->uid, + filename, expunged_guid_128)) continue; if (maildir_file_do(mbox, ctx->uid,