From 7691d616a9ff46d4540d1a0c5a0ecbf64b3ecad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sat, 29 Nov 2014 08:07:41 +0100 Subject: [PATCH] Attempt to sync an UID in setChangeKey to avoid crashing This may happen if between sync cache and setChangeKey a modSeq is making synchroniseCache not retrieve the newly stored message. This should fix the following crash: https://tracker.zentyal.org/issues/2673 --- OpenChange/MAPIStoreMailFolder.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 2d4a20fbb..6140eb141 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -757,7 +757,6 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) messageEntry = [messages objectForKey: messageUID]; if (!messageEntry) { - [messages removeObjectForKey: messageUID]; changeNumber = [[self context] getNewChangeNumber]; fetchResults = [(NSDictionary *) [sogoObject fetchUIDs: [NSArray arrayWithObject: messageUID] parts: [NSArray arrayWithObject: @"modseq"]] @@ -844,12 +843,21 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) { NSMutableDictionary *messages, *messageEntry; NSString *messageUid; + BOOL synced; messageUid = [self messageUIDFromMessageKey: messageKey]; messages = [[versionsMessage properties] objectForKey: @"Messages"]; messageEntry = [messages objectForKey: messageUid]; if (!messageEntry) - abort (); + { + [self warnWithFormat: @"attempting to synchronise to set the change key for " + @"this message %@", messageKey]; + synced = [self synchroniseCacheForUID: messageUid]; + if (synced) + messageEntry = [[[versionsMessage properties] objectForKey: @"Messages"] objectForKey: messageUid]; + else + abort (); + } [self _setChangeKey: changeKey forMessageEntry: messageEntry]; [versionsMessage save];