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

Commit a52f68e3 authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Android Build Coastguard Worker
Browse files

ImageWriter: Check Surface is valid before use

For some reason, getProducer() returns a nullptr even though the
JNI context is valid.

The only explanation is that ~JNIImageWriterContext is called
right before ImageWriter_attachAndQueueImage().
When ImageWriter_attachAndQueueImage() is called, the context is still
valid even though mProducer is already cleared.

Flag: EXEMPT bug-fix
Test: ImageWriterTest
Bug: 362116761
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7f974147592c4d3242a5ae6fca70b2ed079912ea)
Merged-In: Id24e7fc7ac63e703146337690f42df99e3daac5b
Change-Id: Id24e7fc7ac63e703146337690f42df99e3daac5b
parent e1d1b662
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -735,10 +735,15 @@ static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, j
}

static status_t attachAndQeueuGraphicBuffer(JNIEnv* env, JNIImageWriterContext *ctx,
        sp<Surface> surface, sp<GraphicBuffer> gb, jlong timestampNs, jint dataSpace,
        sp<GraphicBuffer> gb, jlong timestampNs, jint dataSpace,
        jint left, jint top, jint right, jint bottom, jint transform, jint scalingMode) {
    status_t res = OK;
    // Step 1. Attach Image
    sp<Surface> surface = ctx->getProducer();
    if (surface == nullptr) {
        jniThrowException(env, "java/lang/IllegalStateException",
                "Producer surface is null, ImageWriter seems already closed");
    }
    res = surface->attachBuffer(gb.get());
    if (res != OK) {
        ALOGE("Attach image failed: %s (%d)", strerror(-res), res);
@@ -835,7 +840,6 @@ static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nat
        return -1;
    }

    sp<Surface> surface = ctx->getProducer();
    if (isFormatOpaque(ctx->getBufferFormat()) != isFormatOpaque(nativeHalFormat)) {
        jniThrowException(env, "java/lang/IllegalStateException",
                "Trying to attach an opaque image into a non-opaque ImageWriter, or vice versa");
@@ -851,7 +855,7 @@ static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nat
        return -1;
    }

    return attachAndQeueuGraphicBuffer(env, ctx, surface, buffer->mGraphicBuffer, timestampNs,
    return attachAndQeueuGraphicBuffer(env, ctx, buffer->mGraphicBuffer, timestampNs,
            dataSpace, left, top, right, bottom, transform, scalingMode);
}

@@ -866,7 +870,6 @@ static jint ImageWriter_attachAndQueueGraphicBuffer(JNIEnv* env, jobject thiz, j
        return -1;
    }

    sp<Surface> surface = ctx->getProducer();
    if (isFormatOpaque(ctx->getBufferFormat()) != isFormatOpaque(nativeHalFormat)) {
        jniThrowException(env, "java/lang/IllegalStateException",
                "Trying to attach an opaque image into a non-opaque ImageWriter, or vice versa");
@@ -880,7 +883,8 @@ static jint ImageWriter_attachAndQueueGraphicBuffer(JNIEnv* env, jobject thiz, j
                "Trying to attach an invalid graphic buffer");
        return -1;
    }
    return attachAndQeueuGraphicBuffer(env, ctx, surface, graphicBuffer, timestampNs,

    return attachAndQeueuGraphicBuffer(env, ctx, graphicBuffer, timestampNs,
            dataSpace, left, top, right, bottom, transform, scalingMode);
}