Skip to content

Commit f8cbdef

Browse files
committed
Fix leak of url sessions in GoogleUtilities
1 parent b661695 commit f8cbdef

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

GoogleUtilities/Network/GULNetworkURLSession.m

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ @implementation GULNetworkURLSession {
3232
#pragma clang diagnostic ignored "-Wunguarded-availability"
3333
/// The session configuration. NSURLSessionConfiguration' is only available on iOS 7.0 or newer.
3434
NSURLSessionConfiguration *_sessionConfig;
35-
#pragma pop
35+
#pragma clang diagnostic pop
3636

3737
/// The path to the directory where all temporary files are stored before uploading.
3838
NSURL *_networkDirectoryURL;
@@ -158,8 +158,7 @@ - (NSString *)sessionIDFromAsyncPOSTRequest:(NSURLRequest *)request
158158
}
159159

160160
// Save the session into memory.
161-
NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIDToFetcherMap];
162-
[sessionIdentifierToFetcherMap setObject:self forKey:_sessionID];
161+
[self setSessionInFetcherMap:session forSessionID:_sessionID];
163162

164163
_request = [request copy];
165164

@@ -201,8 +200,7 @@ - (NSString *)sessionIDFromAsyncGETRequest:(NSURLRequest *)request
201200
}
202201

203202
// Save the session into memory.
204-
NSMapTable *sessionIdentifierToFetcherMap = [[self class] sessionIDToFetcherMap];
205-
[sessionIdentifierToFetcherMap setObject:self forKey:_sessionID];
203+
[self setSessionInFetcherMap:session forSessionID:_sessionID];
206204

207205
_request = [request copy];
208206

@@ -284,6 +282,12 @@ - (void)URLSession:(NSURLSession *)session
284282
// Try to clean up stale files again.
285283
[self maybeRemoveTempFilesAtURL:_networkDirectoryURL
286284
expiringTime:kGULNetworkTempFolderExpireTime];
285+
286+
// Invalidate the session only if it's owned by this class.
287+
NSString *sessionID = session.configuration.identifier;
288+
if ([sessionID hasPrefix:kGULNetworkBackgroundSessionConfigIDPrefix]) {
289+
[session finishTasksAndInvalidate];
290+
}
287291
}
288292

289293
- (void)URLSession:(NSURLSession *)session
@@ -651,6 +655,28 @@ - (void)URLSession:(NSURLSession *)session
651655

652656
#pragma mark - Helper Methods
653657

658+
- (void)setSessionInFetcherMap:(NSURLSession *)session forSessionID:(NSString *)sessionID {
659+
NSURLSession *existingSession = [self sessionFromFetcherMapForSessionID:sessionID];
660+
if (existingSession) {
661+
// Invalidating doesn't seem like the right thing to do here since it may cancel an active
662+
// background transfer if the background session is handling multiple requests. The old
663+
// session will be dropped from the map table, but still complete its request.
664+
NSString *message = [NSString stringWithFormat:@"Discarding URL session: %@", existingSession];
665+
[_loggerDelegate GULNetwork_logWithLevel:kGULNetworkLogLevelInfo
666+
messageCode:kGULNetworkMessageCodeURLSession019
667+
message:message];
668+
}
669+
if (session) {
670+
[[[self class] sessionIDToFetcherMap] setObject:session forKey:sessionID];
671+
} else {
672+
[[[self class] sessionIDToFetcherMap] removeObjectForKey:sessionID];
673+
}
674+
}
675+
676+
- (nullable NSURLSession *)sessionFromFetcherMapForSessionID:(NSString *)sessionID {
677+
return [[[self class] sessionIDToFetcherMap] objectForKey:sessionID];
678+
}
679+
654680
- (void)callCompletionHandler:(GULNetworkURLSessionCompletionHandler)handler
655681
withResponse:(NSHTTPURLResponse *)response
656682
data:(NSData *)data
@@ -669,6 +695,7 @@ - (void)callCompletionHandler:(GULNetworkURLSessionCompletionHandler)handler
669695
}
670696
}
671697

698+
// Always use the request parameters even if the default session configuration is more restrictive.
672699
- (void)populateSessionConfig:(NSURLSessionConfiguration *)sessionConfig
673700
withRequest:(NSURLRequest *)request API_AVAILABLE(ios(7.0)) {
674701
sessionConfig.HTTPAdditionalHeaders = request.allHTTPHeaderFields;

GoogleUtilities/Network/Private/GULNetworkMessageCode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ typedef NS_ENUM(NSInteger, GULNetworkMessageCode) {
4141
kGULNetworkMessageCodeURLSession016 = 901016, // I-NET901016
4242
kGULNetworkMessageCodeURLSession017 = 901017, // I-NET901017
4343
kGULNetworkMessageCodeURLSession018 = 901018, // I-NET901018
44+
kGULNetworkMessageCodeURLSession019 = 901019, // I-NET901019
4445
};

0 commit comments

Comments
 (0)