Mercurial > dovecot > core-2.2
changeset 15667:1b18ff11effc
dsync: Fixes to handling storage formats that don't use 128bit GUIDs.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 21 Jan 2013 19:41:24 +0200 |
parents | 87a709eb7b28 |
children | 583ea6b63c5d |
files | src/doveadm/dsync/dsync-mailbox-import.c |
diffstat | 1 files changed, 23 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-mailbox-import.c Mon Jan 21 18:33:55 2013 +0200 +++ b/src/doveadm/dsync/dsync-mailbox-import.c Mon Jan 21 19:41:24 2013 +0200 @@ -195,6 +195,22 @@ } static bool +dsync_mail_change_guid_equals(const struct dsync_mail_change *change, + const char *guid) +{ + guid_128_t guid_128, change_guid_128; + + if (change->type != DSYNC_MAIL_CHANGE_TYPE_EXPUNGE) + return strcmp(change->guid, guid) == 0; + + if (guid_128_from_string(change->guid, change_guid_128) < 0) + i_unreached(); + + mail_generate_guid_128_hash(guid, guid_128); + return memcmp(change_guid_128, guid_128, GUID_128_SIZE) == 0; +} + +static bool importer_next_mail(struct dsync_mailbox_importer *importer, uint32_t wanted_uid) { if (importer->cur_mail == NULL) { @@ -334,6 +350,7 @@ if (save_change != NULL) { m2.guid = save_change->guid; m2.uid = save_change->uid; + i_assert(save_change->type != DSYNC_MAIL_CHANGE_TYPE_EXPUNGE); } diff = importer_mail_cmp(&m1, &m2); @@ -429,7 +446,7 @@ dsync_mail_error(importer, importer->mail, "GUID"); return FALSE; } - if (strcmp(guid, change->guid) != 0) { + if (!dsync_mail_change_guid_equals(change, guid)) { i_error("Mailbox %s: Unexpected GUID mismatch for " "UID=%u: %s != %s", mailbox_get_vname(importer->box), change->uid, guid, change->guid); @@ -445,7 +462,7 @@ { if (change->guid == NULL || *change->guid == '\0') return TRUE; - if (strcmp(importer->cur_guid, change->guid) != 0) { + if (!dsync_mail_change_guid_equals(change, importer->cur_guid)) { i_error("Mailbox %s: Unexpected GUID mismatch for " "UID=%u: %s != %s", mailbox_get_vname(importer->box), change->uid, importer->cur_guid, change->guid); @@ -926,7 +943,8 @@ if (*change->guid != '\0' && *importer->cur_guid != '\0') { /* we have GUIDs, verify them */ - return strcmp(change->guid, importer->cur_guid) == 0 ? 1 : 0; + return dsync_mail_change_guid_equals(change, + importer->cur_guid) ? 1 : 0; } /* verify hdr_hash if it exists */ @@ -951,7 +969,6 @@ const struct dsync_mail_change *change) { const struct dsync_mail_change *local_change; - guid_128_t guid_128, change_guid_128; if (*change->guid == '\0') { /* remote doesn't support GUIDs, can't verify expunge */ @@ -966,11 +983,9 @@ POINTER_CAST(change->uid)); if (local_change == NULL || local_change->guid == NULL) return FALSE; - if (guid_128_from_string(local_change->guid, guid_128) < 0) - i_unreached(); - mail_generate_guid_128_hash(change->guid, change_guid_128); - if (memcmp(change_guid_128, guid_128, GUID_128_SIZE) != 0) { + i_assert(local_change->type == DSYNC_MAIL_CHANGE_TYPE_EXPUNGE); + if (!dsync_mail_change_guid_equals(local_change, change->guid)) { /* mismatch - found the first non-common UID */ dsync_mailbox_common_uid_found(importer); } else {