From 0551d0a1cbc334ddeb8601c97ccb3e4515e2b2a8 Mon Sep 17 00:00:00 2001 From: Jeff Tung <100387939+jtung-apple@users.noreply.github.com> Date: Wed, 19 Feb 2025 10:05:48 -0800 Subject: [PATCH] [Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock fix (#37664) * [Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock fix * Make sure device map is accessed safely with lock --- .../Framework/CHIP/MTRDeviceController_XPC.mm | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 97f447f1f81ac0..4b7dc4e1de0fe8 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -72,24 +72,28 @@ @implementation MTRDeviceController_XPC - (void)_updateRegistrationInfo { - NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary]; + dispatch_async(self.workQueue, ^{ + std::lock_guard lock(*self.deviceMapLock); - NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary]; - NSMutableArray * nodeIDs = [NSMutableArray array]; + NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary]; - for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { - MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO]; - if ([device delegateExists]) { - NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; - MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) + NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary]; + NSMutableArray * nodeIDs = [NSMutableArray array]; - [nodeIDs addObject:nodeDictionary]; + for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) { + MTRDevice * device = self.nodeIDToDeviceMap[nodeID]; + if ([device delegateExists]) { + NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary]; + MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary) + + [nodeIDs addObject:nodeDictionary]; + } } - } - MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo) - MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo) + MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo) + MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo) - [self updateControllerConfiguration:registrationInfo]; + [self updateControllerConfiguration:registrationInfo]; + }); } - (void)_registerNodeID:(NSNumber *)nodeID