Skip to content

Commit 518a44e

Browse files
mikehaney24paulb777
authored andcommitted
release-6.6.0 fix #2 for GDTUploadCoordinator crashes (#3557)
* 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. * Increment GDT to v1.1.1 GDTCCT has a dep on ~> 1.1, so this incremented version should get picked up. * Actually use the strongified variables I made
1 parent cf9228a commit 518a44e

File tree

3 files changed

+53
-19
lines changed

3 files changed

+53
-19
lines changed

GoogleDataTransport.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'GoogleDataTransport'
3-
s.version = '1.1.0'
3+
s.version = '1.1.1'
44
s.summary = 'Google iOS SDK data transport.'
55

66
s.description = <<-DESC

GoogleDataTransport/GDTLibrary/GDTStorage.m

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,10 +246,24 @@ - (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:targetToEventSet forKey:kGDTStorageTargetToEventSetKey];
262+
}
263+
GDTUploadCoordinator *uploadCoordinator = sharedInstance->_uploadCoordinator;
264+
if (uploadCoordinator) {
265+
[aCoder encodeObject:uploadCoordinator forKey:kGDTStorageUploadCoordinatorKey];
266+
}
253267
});
254268
}
255269

GoogleDataTransport/GDTLibrary/GDTUploadCoordinator.m

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

210210
- (void)packageDelivered:(GDTUploadPackage *)package successful:(BOOL)successful {
211+
if (!_coordinationQueue) {
212+
return;
213+
}
211214
dispatch_async(_coordinationQueue, ^{
212215
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);
216+
NSMutableDictionary<NSNumber *, GDTUploadPackage *> *targetToInFlightPackages =
217+
self->_targetToInFlightPackages;
218+
GDTRegistrar *registrar = self->_registrar;
219+
if (targetToInFlightPackages) {
220+
[targetToInFlightPackages removeObjectForKey:targetNumber];
218221
}
219-
if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) {
220-
[prioritizer packageDelivered:package successful:successful];
222+
if (registrar) {
223+
id<GDTPrioritizer> prioritizer = registrar.targetToPrioritizer[targetNumber];
224+
if (!prioritizer) {
225+
GDTLogError(GDTMCEPrioritizerError,
226+
@"A prioritizer should be registered for this target: %@", targetNumber);
227+
}
228+
if ([prioritizer respondsToSelector:@selector(packageDelivered:successful:)]) {
229+
[prioritizer packageDelivered:package successful:successful];
230+
}
221231
}
222232
[self.storage removeEvents:package.events];
223233
});
224234
}
225235

226236
- (void)packageExpired:(GDTUploadPackage *)package {
237+
if (!_coordinationQueue) {
238+
return;
239+
}
227240
dispatch_async(_coordinationQueue, ^{
228241
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];
242+
NSMutableDictionary<NSNumber *, GDTUploadPackage *> *targetToInFlightPackages =
243+
self->_targetToInFlightPackages;
244+
GDTRegistrar *registrar = self->_registrar;
245+
if (targetToInFlightPackages) {
246+
[targetToInFlightPackages removeObjectForKey:targetNumber];
234247
}
235-
if ([uploader respondsToSelector:@selector(packageExpired:)]) {
236-
[uploader packageExpired:package];
248+
if (registrar) {
249+
id<GDTPrioritizer> prioritizer = registrar.targetToPrioritizer[targetNumber];
250+
id<GDTUploader> uploader = registrar.targetToUploader[targetNumber];
251+
if ([prioritizer respondsToSelector:@selector(packageExpired:)]) {
252+
[prioritizer packageExpired:package];
253+
}
254+
if ([uploader respondsToSelector:@selector(packageExpired:)]) {
255+
[uploader packageExpired:package];
256+
}
237257
}
238258
});
239259
}

0 commit comments

Comments
 (0)