From a1a19d28d0e432c2d90e4fd73146891c57d01479 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Wed, 4 Dec 2013 17:32:43 -0800 Subject: [PATCH] Use exceptionCheck after VMRuntime.newNonMovableArray/addressOf. Since VMRuntime.newNonMovableArray and VMRuntime.addressOf are java methods implemented in Native, they don't necessarily return NULL when an exception is thrown. Checking the exception instead of the return value fixes errors which may occur if the runtime returns garbage when an exception is pending. Bug: 11971220 Change-Id: I70478834c9f14cc5d9e666e1e174d3fd09269719 --- core/jni/android/graphics/Graphics.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 0a8eeab86ae21..38a9ba32781aa 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -547,16 +547,20 @@ jbyteArray GraphicsJNI::allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap, jbyteArray arrayObj = (jbyteArray) env->CallObjectMethod(gVMRuntime, gVMRuntime_newNonMovableArray, gByte_class, size); - if (arrayObj) { - jbyte* addr = (jbyte*) env->CallLongMethod(gVMRuntime, gVMRuntime_addressOf, arrayObj); - if (addr) { - SkPixelRef* pr = new AndroidPixelRef(env, (void*) addr, size, arrayObj, ctable); - bitmap->setPixelRef(pr)->unref(); - // since we're already allocated, we lockPixels right away - // HeapAllocator behaves this way too - bitmap->lockPixels(); - } + if (env->ExceptionCheck() != 0) { + return NULL; } + SkASSERT(arrayObj); + jbyte* addr = (jbyte*) env->CallLongMethod(gVMRuntime, gVMRuntime_addressOf, arrayObj); + if (env->ExceptionCheck() != 0) { + return NULL; + } + SkASSERT(addr); + SkPixelRef* pr = new AndroidPixelRef(env, (void*) addr, size, arrayObj, ctable); + bitmap->setPixelRef(pr)->unref(); + // since we're already allocated, we lockPixels right away + // HeapAllocator behaves this way too + bitmap->lockPixels(); return arrayObj; }