Skip to content

Commit 07a7ea5

Browse files
Fix thread race in MTRXPCListenerSampleTests. (project-chip#26862)
WARNING: ThreadSanitizer: race on NSMutableDictionary (pid=72050) Modifying access of NSMutableDictionary at 0x7b0800149020 by thread T7: #0 -[__NSDictionaryM setObject:forKey:] <null>:2 (CoreFoundation:x86_64+0x40d4e) #1 -[MTRXPCListenerSample listener:shouldAcceptNewConnection:] MTRXPCListenerSampleTests.m:116 (MatterTests:x86_64+0x48437b) #2 service_connection_handler_make_connection <null>:2 (Foundation:x86_64+0xdea93) Previous modifying access of NSMutableDictionary at 0x7b0800149020 by thread T4: #0 -[__NSDictionaryM removeObjectForKey:] <null>:2 (CoreFoundation:x86_64+0x6cd6d) #1 __59-[MTRXPCListenerSample listener:shouldAcceptNewConnection:]_block_invoke MTRXPCListenerSampleTests.m:119 (MatterTests:x86_64+0x484630)
1 parent 8f16fe9 commit 07a7ea5

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

src/darwin/Framework/CHIPTests/MTRXPCListenerSampleTests.m

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
// system dependencies
3535
#import <XCTest/XCTest.h>
36+
#import <os/lock.h>
3637

3738
static uint16_t kTestVendorId = 0xFFF1u;
3839

@@ -73,6 +74,8 @@ @interface MTRXPCListenerSample ()
7374
@property (nonatomic, readonly, strong)
7475
NSMutableDictionary<NSNumber *, MTRClusterStateCacheContainer *> * clusterStateCacheDictionary;
7576

77+
// serversLock controls access to _servers.
78+
@property (nonatomic, readonly) os_unfair_lock serversLock;
7679
@end
7780

7881
@implementation MTRXPCListenerSample
@@ -86,6 +89,7 @@ - (instancetype)init
8689
_clusterStateCacheDictionary = [NSMutableDictionary dictionary];
8790
_xpcListener = [NSXPCListener anonymousListener];
8891
[_xpcListener setDelegate:(id<NSXPCListenerDelegate>) self];
92+
_serversLock = OS_UNFAIR_LOCK_INIT;
8993
}
9094
return self;
9195
}
@@ -113,10 +117,16 @@ - (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConne
113117
__auto_type newServer = [[MTRDeviceControllerServerSample alloc] initWithClientProxy:[newConnection remoteObjectProxy]
114118
clusterStateCacheDictionary:_clusterStateCacheDictionary];
115119
newConnection.exportedObject = newServer;
120+
121+
os_unfair_lock_lock(&_serversLock);
116122
[_servers setObject:newServer forKey:newServer.identifier];
123+
os_unfair_lock_unlock(&_serversLock);
124+
117125
newConnection.invalidationHandler = ^{
118126
NSLog(@"XPC connection disconnected");
127+
os_unfair_lock_lock(&self->_serversLock);
119128
[self.servers removeObjectForKey:newServer.identifier];
129+
os_unfair_lock_unlock(&self->_serversLock);
120130
};
121131
[newConnection resume];
122132
return YES;

0 commit comments

Comments
 (0)