]> nv-tegra.nvidia Code Review - android/platform/dalvik.git/commitdiff
Check for failure in GetDirectBufferAddress.
authorAndy McFadden <fadden@android.com>
Wed, 24 Jun 2009 23:56:06 +0000 (16:56 -0700)
committerAndy McFadden <fadden@android.com>
Wed, 24 Jun 2009 23:56:06 +0000 (16:56 -0700)
We now check for a null result or a pending exception in the JNI
GetDirectBufferAddress function.  This prevents a VM crash when somebody
tries to get the address of a non-direct buffer.

For internal bug 1926596.

vm/Jni.c

index 4bca8d48e98e354b1d5024d704ccb8ab0eb943b5..e56e68d7e53869e0f56017fb1d74cb841f7e45f8 100644 (file)
--- a/vm/Jni.c
+++ b/vm/Jni.c
@@ -2746,6 +2746,10 @@ static void* GetDirectBufferAddress(JNIEnv * env, jobject buf)
     jmethodID toLongMethod;
     void* result = NULL;
 
+    /*
+     * Start by determining if the object supports the DirectBuffer
+     * interfaces.  Note this does not guarantee that it's a direct buffer.
+     */
     tempClass = (*env)->FindClass(env, 
             "org/apache/harmony/nio/internal/DirectBuffer");
     if(!tempClass)
@@ -2764,6 +2768,20 @@ static void* GetDirectBufferAddress(JNIEnv * env, jobject buf)
         goto bail;
     }
     platformAddr = (*env)->CallObjectMethod(env, buf, tempMethod);
+
+    /*
+     * If this isn't a direct buffer, platformAddr will be NULL and/or an
+     * exception will have been thrown.
+     */
+    if ((*env)->ExceptionCheck(env)) {
+        (*env)->ExceptionClear(env);
+        platformAddr = NULL;
+    }
+    if (platformAddr == NULL) {
+        LOGV("Got request for address of non-direct buffer\n");
+        goto bail;
+    }
+
     platformAddrClass = (*env)->FindClass (env, 
             "org/apache/harmony/luni/platform/PlatformAddress");
     if(!platformAddrClass)