From 6aa8be56f6847450aab2a76a1d03da985df20638 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 4 Mar 2016 17:49:28 -0800 Subject: [android] destroyOfflineRegion must not delete an already-deleted peer --- platform/android/src/jni.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'platform/android/src/jni.cpp') diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 1d8b1fe175..fcf1b48622 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1474,16 +1474,18 @@ void destroyOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jlong) { // Offline region jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); + if (!offlineRegionPtr) { + return; // Already deleted + } // File source jni::jobject* jmanager = jni::GetField(*env, offlineRegion_, *offlineRegionOfflineManagerId); jlong defaultFileSourcePtr = jni::GetField(*env, jmanager, *offlineManagerClassPtrId); mbgl::DefaultFileSource *defaultFileSource = reinterpret_cast(defaultFileSourcePtr); - // Release the observer + // Release the observer and delete the region + mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); defaultFileSource->setOfflineRegionObserver(*offlineRegion, nullptr); - delete offlineRegion; } @@ -1698,6 +1700,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* obj, jni::jobject* offlineRe deleteCallback = jni::NewGlobalRef(*env, deleteCallback).release(); // Set new state + jni::SetField(*env, offlineRegion_, *offlineRegionPtrId, 0); defaultFileSource->deleteOfflineRegion(std::move(*offlineRegion), [deleteCallback](std::exception_ptr error) mutable { // Reattach, the callback comes from a different thread -- cgit v1.2.1