Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 113fd301 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

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
parent 3b3388ca
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include "jni.h"
#include "JNIHelp.h"
#include <inttypes.h>

#include "android_os_Parcel.h"
#include "GraphicBuffer.h"
@@ -27,6 +28,8 @@

#include <binder/Parcel.h>

#include <log/log.h>

#include <ui/GraphicBuffer.h>
#include <ui/PixelFormat.h>

@@ -90,9 +93,15 @@ static struct {
class GraphicBufferWrapper {
public:
    explicit GraphicBufferWrapper(const sp<GraphicBuffer>& buffer): buffer(buffer) {
        LOG_ALWAYS_FATAL_IF(buffer == nullptr, "creating a null GraphicBuffer");
    }
    const sp<GraphicBuffer>& get() const {
        return buffer;
    }

    sp<GraphicBuffer> buffer;
private:
    // make sure this is immutable
    sp<GraphicBuffer> const buffer;
};

// ----------------------------------------------------------------------------
@@ -102,6 +111,8 @@ public:
static jlong android_graphics_GraphicBuffer_wrap(JNIEnv* env, jobject clazz,
        jlong unwrapped) {
    sp<GraphicBuffer> b(reinterpret_cast<GraphicBuffer*>(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<jlong>(wrapper);
}
@@ -159,7 +170,7 @@ static jboolean android_graphics_GraphicBuffer_lockCanvas(JNIEnv* env, jobject,
        return JNI_FALSE;
    }

    sp<GraphicBuffer> buffer(wrapper->buffer);
    sp<GraphicBuffer> 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<GraphicBufferWrapper*>(wrapperHandle);
    Parcel* parcel = parcelForJavaObject(env, dest);
    if (parcel) {
        parcel->write(*wrapper->buffer);
        parcel->write(*wrapper->get());
    }
}

@@ -260,7 +272,7 @@ sp<GraphicBuffer> graphicBufferForJavaObject(JNIEnv* env, jobject obj) {
        jlong nativeObject = env->GetLongField(obj, gGraphicBufferClassInfo.mNativeObject);
        GraphicBufferWrapper* wrapper = (GraphicBufferWrapper*) nativeObject;
        if (wrapper != NULL) {
            sp<GraphicBuffer> buffer(wrapper->buffer);
            sp<GraphicBuffer> buffer(wrapper->get());
            return buffer;
        }
    }
@@ -271,7 +283,7 @@ jobject createJavaGraphicBuffer(JNIEnv* env, const sp<GraphicBuffer>& buffer) {
    GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
    jobject obj = env->NewObject(gGraphicBufferClassInfo.mClass,
            gGraphicBufferClassInfo.mConstructorMethodID, buffer->getWidth(), buffer->getHeight(),
            buffer->getPixelFormat(), buffer->getUsage(), reinterpret_cast<jlong>(wrapper));
            buffer->getPixelFormat(), (jint)buffer->getUsage(), reinterpret_cast<jlong>(wrapper));
    return obj;
}

+1 −1
Original line number Diff line number Diff line
@@ -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());
}