diff options
author | Julian Rex <julian.rex@mapbox.com> | 2019-09-18 18:13:07 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-18 18:13:07 -0400 |
commit | 2b08c1d7bf9e867d6450feb6a246ce36dcdf2cd3 (patch) | |
tree | 8041d2169d2c26041c004c3336de08d031a3f9e8 /platform/darwin/src | |
parent | 7bca176beaf4dcae2263eeabee82fd7b6412654b (diff) | |
download | qtlocation-mapboxgl-2b08c1d7bf9e867d6450feb6a246ce36dcdf2cd3.tar.gz |
[ios, macos] Fix MGLOfflinePack invalidate crash (#15582)
Diffstat (limited to 'platform/darwin/src')
-rw-r--r-- | platform/darwin/src/MGLOfflinePack.mm | 11 | ||||
-rw-r--r-- | platform/darwin/src/MGLOfflineStorage.mm | 4 |
2 files changed, 12 insertions, 3 deletions
diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm index 0f2e8180fa..5f4ae9c838 100644 --- a/platform/darwin/src/MGLOfflinePack.mm +++ b/platform/darwin/src/MGLOfflinePack.mm @@ -135,10 +135,15 @@ private: - (void)invalidate { MGLLogInfo(@"Invalidating pack."); MGLAssert(_state != MGLOfflinePackStateInvalid, @"Cannot invalidate an already invalid offline pack."); + MGLAssert(self.mbglOfflineRegion, @"Should have a valid region"); - self.state = MGLOfflinePackStateInvalid; - _mbglFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr); - self.mbglOfflineRegion = nil; + @synchronized (self) { + self.state = MGLOfflinePackStateInvalid; + if (self.mbglOfflineRegion) { + _mbglFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr); + } + self.mbglOfflineRegion = nil; + } } - (void)setState:(MGLOfflinePackState)state { diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm index 93f986a518..32d1735bc0 100644 --- a/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/darwin/src/MGLOfflineStorage.mm @@ -426,11 +426,15 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio - (void)_removePack:(MGLOfflinePack *)pack withCompletionHandler:(MGLOfflinePackRemovalCompletionHandler)completion { mbgl::OfflineRegion *mbglOfflineRegion = pack.mbglOfflineRegion; + [pack invalidate]; + if (!mbglOfflineRegion) { + MGLAssert(pack.state == MGLOfflinePackStateInvalid, @"State should be invalid"); completion(nil); return; } + _mbglFileSource->deleteOfflineRegion(std::move(*mbglOfflineRegion), [&, completion](std::exception_ptr exception) { NSError *error; if (exception) { |