OSDN Git Service

Prevent use of a null sCallbackObj by Hardware FLP
authorWyatt Riley <wyattriley@google.com>
Thu, 26 May 2016 02:53:46 +0000 (19:53 -0700)
committerWyatt Riley <wyattriley@google.com>
Thu, 26 May 2016 03:01:22 +0000 (20:01 -0700)
Bug: 28730136
Change-Id: I5898583e8108c4cfa8574a0adc5b50d6983b247e

services/core/jni/com_android_server_location_FlpHardwareProvider.cpp

index 8ea9bfc..06d2031 100644 (file)
@@ -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,