dovecot-2.0: maildir: Fixed expunging messages with GUIDs in uid...

dovecot at dovecot.org dovecot at dovecot.org
Thu Sep 23 18:36:03 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/c24206d083e8
changeset: 12156:c24206d083e8
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Sep 23 16:36:00 2010 +0100
description:
maildir: Fixed expunging messages with GUIDs in uidlist.

diffstat:

 src/lib-storage/index/maildir/maildir-sync-index.c |  36 ++++++++++++------
 1 files changed, 24 insertions(+), 12 deletions(-)

diffs (72 lines):

diff -r 75e466740c57 -r c24206d083e8 src/lib-storage/index/maildir/maildir-sync-index.c
--- 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,


More information about the dovecot-cvs mailing list