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 1/2] 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]; From 97201c56a45ac51ea744fe85ca4e875a87c5fe68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Mon, 1 Dec 2014 10:47:16 +0100 Subject: [PATCH 2/2] abort if attemp to sync an UID in setChangekey fails --- OpenChange/MAPIStoreMailFolder.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 6140eb141..58cab6105 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -855,8 +855,11 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) synced = [self synchroniseCacheForUID: messageUid]; if (synced) messageEntry = [[[versionsMessage properties] objectForKey: @"Messages"] objectForKey: messageUid]; - else - abort (); + if (!messageEntry) + { + [self errorWithFormat: @"still nothing. We crash!"]; + abort (); + } } [self _setChangeKey: changeKey forMessageEntry: messageEntry];