From: Andy McFadden Date: Wed, 24 Jun 2009 23:56:06 +0000 (-0700) Subject: Check for failure in GetDirectBufferAddress. X-Git-Tag: android-x86-1.6~10^2~6^2 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fdalvik.git;a=commitdiff_plain;h=72d61fba8ad3d3c720e6df61c7ae07baa4fd7838 Check for failure in GetDirectBufferAddress. 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. --- diff --git a/vm/Jni.c b/vm/Jni.c index 4bca8d48e..e56e68d7e 100644 --- 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)