Skip to content

Commit 0551d0a

Browse files
authored
[Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock fix (project-chip#37664)
* [Darwin] MTRDeviceController_XPC _updateRegistrationInfo double lock fix * Make sure device map is accessed safely with lock
1 parent 1bd8e40 commit 0551d0a

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm

+17-13
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,28 @@ @implementation MTRDeviceController_XPC
7272

7373
- (void)_updateRegistrationInfo
7474
{
75-
NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary];
75+
dispatch_async(self.workQueue, ^{
76+
std::lock_guard lock(*self.deviceMapLock);
7677

77-
NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary];
78-
NSMutableArray * nodeIDs = [NSMutableArray array];
78+
NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary];
7979

80-
for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) {
81-
MTRDevice * device = [self _deviceForNodeID:nodeID createIfNeeded:NO];
82-
if ([device delegateExists]) {
83-
NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary];
84-
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary)
80+
NSMutableDictionary * controllerContext = [NSMutableDictionary dictionary];
81+
NSMutableArray * nodeIDs = [NSMutableArray array];
8582

86-
[nodeIDs addObject:nodeDictionary];
83+
for (NSNumber * nodeID in [self.nodeIDToDeviceMap keyEnumerator]) {
84+
MTRDevice * device = self.nodeIDToDeviceMap[nodeID];
85+
if ([device delegateExists]) {
86+
NSMutableDictionary * nodeDictionary = [NSMutableDictionary dictionary];
87+
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDKey, nodeID, nodeDictionary)
88+
89+
[nodeIDs addObject:nodeDictionary];
90+
}
8791
}
88-
}
89-
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo)
90-
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo)
92+
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationNodeIDsKey, nodeIDs, registrationInfo)
93+
MTR_REQUIRED_ATTRIBUTE(MTRDeviceControllerRegistrationControllerContextKey, controllerContext, registrationInfo)
9194

92-
[self updateControllerConfiguration:registrationInfo];
95+
[self updateControllerConfiguration:registrationInfo];
96+
});
9397
}
9498

9599
- (void)_registerNodeID:(NSNumber *)nodeID

0 commit comments

Comments
 (0)