From c8f13d504f84ac96efc1283d42f19c1366cf790a Mon Sep 17 00:00:00 2001 From: Wyatt Riley Date: Wed, 25 May 2016 19:53:46 -0700 Subject: [PATCH] Prevent use of a null sCallbackObj by Hardware FLP Bug: 28730136 Change-Id: I5898583e8108c4cfa8574a0adc5b50d6983b247e --- ...id_server_location_FlpHardwareProvider.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp index 8ea9bfc04662e..06d2031e4a4a1 100644 --- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp +++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp @@ -78,7 +78,7 @@ static inline void ThrowOnError( env->ThrowNew(exceptionClass, methodName); } -static bool IsValidCallbackThread() { +static bool IsValidCallbackThreadEnvOnly() { JNIEnv* env = AndroidRuntime::getJNIEnv(); if(sCallbackEnv == NULL || sCallbackEnv != env) { @@ -89,6 +89,20 @@ static bool IsValidCallbackThread() { return true; } +static bool IsValidCallbackThread() { + // sCallbacksObject is created when FlpHardwareProvider on Java side is + // initialized. Sometimes the hardware may call a function before the Java + // side is ready. In order to prevent a system crash, check whether + // sCallbacksObj has been created. If not, simply ignore this event from + // hardware. + if (sCallbacksObj == NULL) { + ALOGE("Attempt to use FlpHardwareProvider blocked, because it hasn't been initialized."); + return false; + } + + return IsValidCallbackThreadEnvOnly(); +} + static void BatchingCapabilitiesCallback(int32_t capabilities) { if(!IsValidCallbackThread()) { return; @@ -154,7 +168,7 @@ static int SetThreadEvent(ThreadEvent event) { } case DISASSOCIATE_JVM: { - if (!IsValidCallbackThread()) { + if (!IsValidCallbackThreadEnvOnly()) { ALOGE( "Attempted to dissasociate an unnownk callback thread : '%s'.", __FUNCTION__ @@ -661,16 +675,6 @@ static void GeofenceMonitorStatusCallback( TranslateToObject(lastLocation, locationObject); } - // sCallbacksObject is created when FlpHardwareProvider on Java side is - // initialized. Sometimes the hardware may call this function before the Java - // side is ready. In order to prevent the system crash, check whether - // sCallbacksObj has been created. If not, simply ignore this event from - // hardware. - if (sCallbacksObj == NULL) { - ALOGE("FlpHardwareProvider hasn't been initialized."); - return; - } - sCallbackEnv->CallVoidMethod( sCallbacksObj, sOnGeofenceMonitorStatus,