From e3564e2e7e6638f550f22b57df8c357b5c1265d4 Mon Sep 17 00:00:00 2001 From: Piotr Wegrzynek Date: Fri, 5 Jun 2026 12:47:24 +0200 Subject: [PATCH] Perform XPath lookups on private XML node copy to maintain thread safety --- .../CoreDataStorage/XMPPMessageArchivingCoreDataStorage.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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;