Skip to content

Commit cf38912

Browse files
zhongwuzwM-i-k-e-l
authored andcommitted
Fixes race condition of Network module (facebook#25156)
Summary: There exists race condition in `sendRequest:withDelegate:` method, it can do the session creation multiple times, because we don't lock that, which would leads `EXC_BAD_ACCESS` because use and deallocated session concurrently, we can refer to how to create a singleton safely. Related facebook#25152. ## Changelog [iOS] [Fixed] - Fixes race condition of Network module Pull Request resolved: facebook#25156 Differential Revision: D15671734 Pulled By: sammy-SC fbshipit-source-id: 5021e6cf33c2b55e3f7adf573ab5c8e6a8d82e23
1 parent b90f6f5 commit cf38912

File tree

1 file changed

+7
-13
lines changed

1 file changed

+7
-13
lines changed

Libraries/Network/RCTHTTPRequestHandler.mm

+7-13
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ @implementation RCTHTTPRequestHandler
2929

3030
- (void)invalidate
3131
{
32-
dispatch_async(self->_methodQueue, ^{
33-
[self->_session invalidateAndCancel];
34-
self->_session = nil;
35-
});
32+
std::lock_guard<std::mutex> lock(_mutex);
33+
[self->_session invalidateAndCancel];
34+
self->_session = nil;
3635
}
3736

37+
// Needs to lock before call this method.
3838
- (BOOL)isValid
3939
{
4040
// if session == nil and delegates != nil, we've been invalidated
@@ -58,6 +58,7 @@ - (BOOL)canHandleRequest:(NSURLRequest *)request
5858
- (NSURLSessionDataTask *)sendRequest:(NSURLRequest *)request
5959
withDelegate:(id<RCTURLRequestDelegate>)delegate
6060
{
61+
std::lock_guard<std::mutex> lock(_mutex);
6162
// Lazy setup
6263
if (!_session && [self isValid]) {
6364
// You can override default NSURLSession instance property allowsCellularAccess (default value YES)
@@ -83,19 +84,12 @@ - (NSURLSessionDataTask *)sendRequest:(NSURLRequest *)request
8384
delegate:self
8485
delegateQueue:callbackQueue];
8586

86-
std::lock_guard<std::mutex> lock(_mutex);
8787
_delegates = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory
8888
valueOptions:NSPointerFunctionsStrongMemory
8989
capacity:0];
9090
}
91-
__block NSURLSessionDataTask *task = nil;
92-
dispatch_sync(self->_methodQueue, ^{
93-
task = [self->_session dataTaskWithRequest:request];
94-
});
95-
{
96-
std::lock_guard<std::mutex> lock(_mutex);
97-
[_delegates setObject:delegate forKey:task];
98-
}
91+
NSURLSessionDataTask *task = [_session dataTaskWithRequest:request];
92+
[_delegates setObject:delegate forKey:task];
9993
[task resume];
10094
return task;
10195
}

0 commit comments

Comments
 (0)