From 113fd301709dffb60693c99d91e59a9b0ab3a74c Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Thu, 25 May 2017 18:31:04 -0700 Subject: [PATCH] use 64-bits usage bits almost everywhere this part fixes crashes due to how JNI uses variadic calls, so changing the return type of some methods will corrupt the stack silently on those calls Test: built, manual, cts as in b/38466700 Bug: 38466700 Bug: 33350696 Change-Id: I0e11cf0bb2fde2cf3a787e672c00d2dc0ccfb501 --- core/jni/android/graphics/GraphicBuffer.cpp | 24 +++++++++++++++------ core/jni/android_view_SurfaceControl.cpp | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/core/jni/android/graphics/GraphicBuffer.cpp b/core/jni/android/graphics/GraphicBuffer.cpp index 73e53c6f93a24..1017cba017056 100644 --- a/core/jni/android/graphics/GraphicBuffer.cpp +++ b/core/jni/android/graphics/GraphicBuffer.cpp @@ -18,6 +18,7 @@ #include "jni.h" #include "JNIHelp.h" +#include #include "android_os_Parcel.h" #include "GraphicBuffer.h" @@ -27,6 +28,8 @@ #include +#include + #include #include @@ -90,9 +93,15 @@ static struct { class GraphicBufferWrapper { public: explicit GraphicBufferWrapper(const sp& buffer): buffer(buffer) { + LOG_ALWAYS_FATAL_IF(buffer == nullptr, "creating a null GraphicBuffer"); + } + const sp& get() const { + return buffer; } - sp buffer; +private: + // make sure this is immutable + sp const buffer; }; // ---------------------------------------------------------------------------- @@ -102,6 +111,8 @@ public: static jlong android_graphics_GraphicBuffer_wrap(JNIEnv* env, jobject clazz, jlong unwrapped) { sp b(reinterpret_cast(unwrapped)); + LOG_ALWAYS_FATAL_IF(b == nullptr, + "*** android_graphics_GraphicBuffer_wrap() invalid state, b is null, unwrapped=%#" PRIx64, unwrapped); GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(b); return reinterpret_cast(wrapper); } @@ -159,7 +170,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject, return JNI_FALSE; } - sp buffer(wrapper->buffer); + sp buffer(wrapper->get()); Rect rect(Rect::EMPTY_RECT); if (dirtyRect) { @@ -217,7 +228,7 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env, nativeCanvas->setBitmap(SkBitmap()); if (wrapper) { - status_t status = wrapper->buffer->unlock(); + status_t status = wrapper->get()->unlock(); return status == 0 ? JNI_TRUE : JNI_FALSE; } @@ -230,11 +241,12 @@ static jboolean android_graphics_GraphicBuffer_unlockCanvasAndPost(JNIEnv* env, static void android_graphics_GraphicBuffer_write(JNIEnv* env, jobject clazz, jlong wrapperHandle, jobject dest) { + GraphicBufferWrapper* wrapper = reinterpret_cast(wrapperHandle); Parcel* parcel = parcelForJavaObject(env, dest); if (parcel) { - parcel->write(*wrapper->buffer); + parcel->write(*wrapper->get()); } } @@ -260,7 +272,7 @@ sp graphicBufferForJavaObject(JNIEnv* env, jobject obj) { jlong nativeObject = env->GetLongField(obj, gGraphicBufferClassInfo.mNativeObject); GraphicBufferWrapper* wrapper = (GraphicBufferWrapper*) nativeObject; if (wrapper != NULL) { - sp buffer(wrapper->buffer); + sp buffer(wrapper->get()); return buffer; } } @@ -271,7 +283,7 @@ jobject createJavaGraphicBuffer(JNIEnv* env, const sp& buffer) { GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer); jobject obj = env->NewObject(gGraphicBufferClassInfo.mClass, gGraphicBufferClassInfo.mConstructorMethodID, buffer->getWidth(), buffer->getHeight(), - buffer->getPixelFormat(), buffer->getUsage(), reinterpret_cast(wrapper)); + buffer->getPixelFormat(), (jint)buffer->getUsage(), reinterpret_cast(wrapper)); return obj; } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 8b82314476430..497f00c9d5a24 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -166,7 +166,7 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz, buffer->getWidth(), buffer->getHeight(), buffer->getPixelFormat(), - buffer->getUsage(), + (jint)buffer->getUsage(), (jlong)buffer.get()); }