From b318903ab96f80de4e73dbbffb0f19be028b44ff Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 4 Mar 2016 18:32:55 -0800 Subject: [PATCH] [android] Don't crash if someone tries to use OfflineRegion after delete --- platform/android/src/jni.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 7d2ae1f9c..237fbb99d 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1469,6 +1469,15 @@ void setOfflineMapboxTileCountLimit(JNIEnv *env, jni::jobject* obj, jlong defaul defaultFileSource->setOfflineMapboxTileCountLimit(limit); } +mbgl::OfflineRegion* getOfflineRegionPeer(JNIEnv *env, jni::jobject* offlineRegion_) { + jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); + if (!offlineRegionPtr) { + jni::ThrowNew(*env, jni::FindClass(*env, "java/lang/IllegalStateException"), + "Use of OfflineRegion after OfflineRegion.delete"); + } + return reinterpret_cast(offlineRegionPtr); +} + void destroyOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_) { mbgl::Log::Debug(mbgl::Event::JNI, "destroyOfflineRegion"); @@ -1494,8 +1503,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo mbgl::Log::Debug(mbgl::Event::JNI, "setOfflineRegionObserver"); // Offline region - jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1617,8 +1625,7 @@ void setOfflineRegionDownloadState(JNIEnv *env, jni::jobject* offlineRegion_, ji } // Offline region - jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1633,8 +1640,7 @@ void getOfflineRegionStatus(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobj mbgl::Log::Debug(mbgl::Event::JNI, "getOfflineRegionStatus"); // Offline region - jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1689,8 +1695,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobject mbgl::Log::Debug(mbgl::Event::JNI, "deleteOfflineRegion"); // Offline region - jlong offlineRegionPtr = jni::GetField(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField(*env, offlineRegion_, *offlineRegionOfflineManagerId);