OSDN Git Service

Minor fixes to CheckJNI.
authorAndy McFadden <fadden@android.com>
Wed, 22 Jul 2009 22:20:08 +0000 (15:20 -0700)
committerAndy McFadden <fadden@android.com>
Wed, 22 Jul 2009 22:20:08 +0000 (15:20 -0700)
We weren't always switching to "running" mode before playing with
objects.  Now checkObject() always changes modes, and things that called
checkObject while in "running" mode now do so after switching back to
"native" (which shouldn't matter now, but I don't want to require nested
switching to work if I don't have to).

Vaguely related to internal bug 1943379, since I think we want to do
some updates to CheckJNI there.

vm/CheckJni.c

index 0601e72..a7378ba 100644 (file)
@@ -319,7 +319,7 @@ static void checkFieldType(jobject obj, jfieldID fieldID, PrimitiveType prim,
  * Verify that "obj" is a valid object, and that it's an object that JNI
  * is allowed to know about.  We allow NULL references.
  *
- * The caller should have switched to "running" mode before calling here.
+ * Switches to "running" mode before performing checks.
  */
 static void checkObject(JNIEnv* env, jobject obj, const char* func)
 {
@@ -328,6 +328,8 @@ static void checkObject(JNIEnv* env, jobject obj, const char* func)
 
     if (obj == NULL)
         return;
+
+    JNI_ENTER();
     if (!dvmIsValidObject(obj)) {
         LOGW("JNI WARNING: native code passing in bad object %p (%s)\n",
             obj, func);
@@ -341,6 +343,8 @@ static void checkObject(JNIEnv* env, jobject obj, const char* func)
         showLocation(dvmGetCurrentJNIMethod(), func);
         abortMaybe();
     }
+
+    JNI_EXIT();
 }
 
 /*
@@ -371,14 +375,13 @@ static void checkClass(JNIEnv* env, jclass jclazz, const char* func)
         LOGW("JNI WARNING: jclass does not point to class object (%p - %s)\n",
             jclazz, clazz->descriptor);
         printWarn = true;
-    } else {
-        checkObject(env, jclazz, func);
     }
+    JNI_EXIT();
 
     if (printWarn)
         abortMaybe();
-
-    JNI_EXIT();
+    else
+        checkObject(env, jclazz, func);
 }
 
 /*
@@ -403,14 +406,13 @@ static void checkString(JNIEnv* env, jstring str, const char* func)
         else
             LOGW("JNI WARNING: jstring %p is bogus (%s)\n", str, func);
         printWarn = true;
-    } else {
-        checkObject(env, str, func);
     }
+    JNI_EXIT();
 
     if (printWarn)
         abortMaybe();
-
-    JNI_EXIT();
+    else
+        checkObject(env, str, func);
 }
 
 /*
@@ -543,14 +545,14 @@ static void checkArray(JNIEnv* env, jarray array, const char* func)
         else
             LOGW("JNI WARNING: jarray is bogus (%p)\n", array);
         printWarn = true;
-    } else {
-        checkObject(env, array, func);
     }
 
+    JNI_EXIT();
+
     if (printWarn)
         abortMaybe();
-
-    JNI_EXIT();
+    else
+        checkObject(env, array, func);
 }
 
 /*
@@ -643,10 +645,12 @@ static void checkStaticFieldID(JNIEnv* env, jclass clazz, jfieldID fieldID)
 static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID,
     const char* func)
 {
+    JNI_ENTER();
+
     if (obj == NULL) {
         LOGW("JNI WARNING: invalid null object (%s)\n", func);
         abortMaybe();
-        return;
+        goto bail;
     }
 
     ClassObject* clazz = ((Object*)obj)->clazz;
@@ -659,7 +663,7 @@ static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID,
         if ((InstField*) fieldID >= clazz->ifields &&
             (InstField*) fieldID < clazz->ifields + clazz->ifieldCount)
         {
-            return;
+            goto bail;
         }
 
         clazz = clazz->super;
@@ -668,6 +672,9 @@ static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID,
     LOGW("JNI WARNING: inst fieldID %p not valid for class %s\n",
         fieldID, ((Object*)obj)->clazz->descriptor);
     abortMaybe();
+
+bail:
+    JNI_EXIT();
 }