Skip to content

Commit 23e4a63

Browse files
authored
Make ivar references safer (#3555)
Fixes 3547, in theory. This code all goes away/changes with the sqlite refactor, so making it safe is probably sufficient for now. No one was able to reproduce locally, most likely because this is a lifecycle issue.
1 parent 96b828d commit 23e4a63

File tree

2 files changed

+57
-20
lines changed

2 files changed

+57
-20
lines changed

GoogleDataTransport/GDTLibrary/GDTStorage.m

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,25 @@ - (instancetype)initWithCoder:(NSCoder *)aDecoder {
246246

247247
- (void)encodeWithCoder:(NSCoder *)aCoder {
248248
GDTStorage *sharedInstance = [self.class sharedInstance];
249-
dispatch_sync(sharedInstance.storageQueue, ^{
250-
[aCoder encodeObject:sharedInstance->_storedEvents forKey:kGDTStorageStoredEventsKey];
251-
[aCoder encodeObject:sharedInstance->_targetToEventSet forKey:kGDTStorageTargetToEventSetKey];
252-
[aCoder encodeObject:sharedInstance->_uploadCoordinator forKey:kGDTStorageUploadCoordinatorKey];
249+
dispatch_queue_t storageQueue = sharedInstance.storageQueue;
250+
if (!storageQueue) {
251+
return;
252+
}
253+
dispatch_sync(storageQueue, ^{
254+
NSMutableOrderedSet<GDTStoredEvent *> *storedEvents = sharedInstance->_storedEvents;
255+
if (storedEvents) {
256+
[aCoder encodeObject:storedEvents forKey:kGDTStorageStoredEventsKey];
257+
}
258+
NSMutableDictionary<NSNumber *, NSMutableSet<GDTStoredEvent *> *> *targetToEventSet =
259+
sharedInstance->_targetToEventSet;
260+
if (targetToEventSet) {
261+
[aCoder encodeObject:sharedInstance->_targetToEventSet forKey:kGDTStorageTargetToEventSetKey];
262+
}
263+
GDTUploadCoordinator *uploadCoordinator = sharedInstance->_uploadCoordinator;
264+
if (uploadCoordinator) {
265+
[aCoder encodeObject:sharedInstance->_uploadCoordinator
266+
forKey:kGDTStorageUploadCoordinatorKey];
267+
}
253268
});
254269
}
255270

GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -208,32 +208,54 @@ - (void)appWillTerminate:(GDTApplication *)application {
208208
#pragma mark - GDTUploadPackageProtocol
209209

210210
- (void)packageDelivered:(GDTUploadPackage *)package successful:(BOOL)successful {
211-
dispatch_async(_coordinationQueue, ^{
211+
dispatch_queue_t coordinationQueue = _coordinationQueue;
212+
if (!_coordinationQueue) {
213+
return;
214+
}
215+
dispatch_async(coordinationQueue, ^{
212216
NSNumber *targetNumber = @(package.target);
213-
[self->_targetToInFlightPackages removeObjectForKey:targetNumber];
214-
id<GDTPrioritizer> prioritizer = self->_registrar.targetToPrioritizer[targetNumber];
215-
if (!prioritizer) {
216-
GDTLogError(GDTMCEPrioritizerError, @"A prioritizer should be registered for this target: %@",
217-
targetNumber);
217+
NSMutableDictionary<NSNumber *, GDTUploadPackage *> *targetToInFlightPackages =
218+
self->_targetToInFlightPackages;
219+
GDTRegistrar *registrar = self->_registrar;
220+
if (targetToInFlightPackages) {
221+
[targetToInFlightPackages removeObjectForKey:targetNumber];
218222
}
219-
if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) {
220-
[prioritizer packageDelivered:package successful:successful];
223+
if (registrar) {
224+
id<GDTPrioritizer> prioritizer = registrar.targetToPrioritizer[targetNumber];
225+
if (!prioritizer) {
226+
GDTLogError(GDTMCEPrioritizerError,
227+
@"A prioritizer should be registered for this target: %@", targetNumber);
228+
}
229+
if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) {
230+
[prioritizer packageDelivered:package successful:successful];
231+
}
221232
}
222233
[self.storage removeEvents:package.events];
223234
});
224235
}
225236

226237
- (void)packageExpired:(GDTUploadPackage *)package {
227-
dispatch_async(_coordinationQueue, ^{
238+
dispatch_queue_t coordinationQueue = _coordinationQueue;
239+
if (!_coordinationQueue) {
240+
return;
241+
}
242+
dispatch_async(coordinationQueue, ^{
228243
NSNumber *targetNumber = @(package.target);
229-
[self->_targetToInFlightPackages removeObjectForKey:targetNumber];
230-
id<GDTPrioritizer> prioritizer = self->_registrar.targetToPrioritizer[targetNumber];
231-
id<GDTUploader> uploader = self->_registrar.targetToUploader[targetNumber];
232-
if ([prioritizer respondsToSelector:@selector(packageExpired:)]) {
233-
[prioritizer packageExpired:package];
244+
NSMutableDictionary<NSNumber *, GDTUploadPackage *> *targetToInFlightPackages =
245+
self->_targetToInFlightPackages;
246+
GDTRegistrar *registrar = self->_registrar;
247+
if (targetToInFlightPackages) {
248+
[targetToInFlightPackages removeObjectForKey:targetNumber];
234249
}
235-
if ([uploader respondsToSelector:@selector(packageExpired:)]) {
236-
[uploader packageExpired:package];
250+
if (registrar) {
251+
id<GDTPrioritizer> prioritizer = registrar.targetToPrioritizer[targetNumber];
252+
id<GDTUploader> uploader = registrar.targetToUploader[targetNumber];
253+
if ([prioritizer respondsToSelector:@selector(packageExpired:)]) {
254+
[prioritizer packageExpired:package];
255+
}
256+
if ([uploader respondsToSelector:@selector(packageExpired:)]) {
257+
[uploader packageExpired:package];
258+
}
237259
}
238260
});
239261
}

0 commit comments

Comments
 (0)