diff --git a/Extensions/XEP-0136/CoreDataStorage/XMPPMessageArchivingCoreDataStorage.m b/Extensions/XEP-0136/CoreDataStorage/XMPPMessageArchivingCoreDataStorage.m index de644e946..a53114927 100644 --- a/Extensions/XEP-0136/CoreDataStorage/XMPPMessageArchivingCoreDataStorage.m +++ b/Extensions/XEP-0136/CoreDataStorage/XMPPMessageArchivingCoreDataStorage.m @@ -208,9 +208,12 @@ - (XMPPMessageArchiving_Message_CoreDataObject *)composingMessageWithJid:(XMPPJI - (BOOL)messageContainsRelevantContent:(XMPPMessage *)message { + // The underlying XML processing is thread safe for read access only: https://github.com/robbiehanson/KissXML/wiki/MemoryManagementThreadSafety + // XPath-based node lookup has to be performed on a copy as it requires temporary document assignment and therefore is not a strictly read operation + XMPPMessage *messageCopy = [message copy]; for (NSString *XPath in self.relevantContentXPaths) { NSError *error; - NSArray *nodes = [message nodesForXPath:XPath error:&error]; + NSArray *nodes = [messageCopy nodesForXPath:XPath error:&error]; if (!nodes) { XMPPLogError(@"%@: %@ - Error querying XPath (%@): %@", THIS_FILE, THIS_METHOD, XPath, error); continue;