OSDN Git Service

Test for null object in the Get<Type>Field and Set<Type>Field JNI functions.
authorAndy McFadden <fadden@android.com>
Mon, 4 May 2009 19:28:51 +0000 (12:28 -0700)
committerAndy McFadden <fadden@android.com>
Mon, 4 May 2009 19:28:51 +0000 (12:28 -0700)
Also adds some "return" calls after abortMaybe(), since it won't actually
abort if "warnonly" is set.

vm/CheckJni.c

index 0f7f5da..0601e72 100644 (file)
@@ -84,6 +84,8 @@
 
 #define CHECK_FIELD_TYPE(_obj, _fieldid, _prim, _isstatic)                  \
     checkFieldType(_obj, _fieldid, _prim, _isstatic, __FUNCTION__)
+#define CHECK_INST_FIELD_ID(_env, _obj, _fieldid)                           \
+    checkInstanceFieldID(_env, _obj, _fieldid, __FUNCTION__)
 #define CHECK_CLASS(_env, _clazz)                                           \
     checkClass(_env, _clazz, __FUNCTION__)
 #define CHECK_STRING(_env, _str)                                            \
@@ -638,8 +640,15 @@ static void checkStaticFieldID(JNIEnv* env, jclass clazz, jfieldID fieldID)
 /*
  * Verify that this instance field ID is valid for this object.
  */
-static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID)
+static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID,
+    const char* func)
 {
+    if (obj == NULL) {
+        LOGW("JNI WARNING: invalid null object (%s)\n", func);
+        abortMaybe();
+        return;
+    }
+
     ClassObject* clazz = ((Object*)obj)->clazz;
 
     /*
@@ -902,6 +911,7 @@ static void* releaseGuardedPACopy(ArrayObject* array, void* dataBuf, int mode)
     if (!checkGuardedCopy(dataBuf, true)) {
         LOGE("JNI: failed guarded copy check in releaseGuardedPACopy\n");
         abortMaybe();
+        return NULL;
     }
 
     switch (mode) {
@@ -1341,7 +1351,7 @@ SET_STATIC_TYPE_FIELD(jdouble, Double, PRIM_DOUBLE);
         CHECK_ENTER(env, kFlag_Default);                                    \
         CHECK_OBJECT(env, obj);                                             \
         _ctype result;                                                      \
-        checkInstanceFieldID(env, obj, fieldID);                            \
+        CHECK_INST_FIELD_ID(env, obj, fieldID);                             \
         result = BASE_ENV(env)->Get##_jname##Field(env, obj, fieldID);      \
         CHECK_EXIT(env);                                                    \
         return result;                                                      \
@@ -1362,7 +1372,7 @@ GET_TYPE_FIELD(jdouble, Double, false);
     {                                                                       \
         CHECK_ENTER(env, kFlag_Default);                                    \
         CHECK_OBJECT(env, obj);                                             \
-        checkInstanceFieldID(env, obj, fieldID);                            \
+        CHECK_INST_FIELD_ID(env, obj, fieldID);                             \
         CHECK_FIELD_TYPE((jobject)(u4) value, fieldID, _ftype, false);      \
         BASE_ENV(env)->Set##_jname##Field(env, obj, fieldID, value);        \
         CHECK_EXIT(env);                                                    \
@@ -1584,6 +1594,7 @@ static void Check_ReleaseStringChars(JNIEnv* env, jstring string,
         if (!checkGuardedCopy(chars, false)) {
             LOGE("JNI: failed guarded copy check in ReleaseStringChars\n");
             abortMaybe();
+            return;
         }
         chars = (const jchar*) freeGuardedCopy((jchar*)chars);
     }
@@ -1639,6 +1650,7 @@ static void Check_ReleaseStringUTFChars(JNIEnv* env, jstring string,
         if (!checkGuardedCopy(utf, false)) {
             LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars\n");
             abortMaybe();
+            return;
         }
         utf = (const char*) freeGuardedCopy((char*)utf);
     }
@@ -1905,6 +1917,7 @@ static void Check_ReleaseStringCritical(JNIEnv* env, jstring string,
         if (!checkGuardedCopy(carray, false)) {
             LOGE("JNI: failed guarded copy check in ReleaseStringCritical\n");
             abortMaybe();
+            return;
         }
         carray = (const jchar*) freeGuardedCopy((jchar*)carray);
     }
@@ -1958,6 +1971,7 @@ static jobject Check_NewDirectByteBuffer(JNIEnv* env, void* address,
         LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)\n",
             address, (long) capacity);
         abortMaybe();
+        return NULL;
     }
     result = BASE_ENV(env)->NewDirectByteBuffer(env, address, capacity);
     CHECK_EXIT(env);