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

Commit e2fc2572 authored by Miao Wang's avatar Miao Wang Committed by Gerrit Code Review
Browse files

Merge "[RenderScript] Fix potential leak in RS JNI"

parents 3289547d a4ad5f84
Loading
Loading
Loading
Loading
+101 −59
Original line number Original line Diff line number Diff line
@@ -2346,62 +2346,75 @@ nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels,
        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
        ALOGD("nScriptGroupCreate, con(%p)", (RsContext)con);
    }
    }


    jlong id = 0;

    RsScriptKernelID* kernelsPtr;
    jint kernelsLen = _env->GetArrayLength(_kernels);
    jint kernelsLen = _env->GetArrayLength(_kernels);
    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);
    jlong *jKernelsPtr = _env->GetLongArrayElements(_kernels, nullptr);

    RsScriptKernelID* srcPtr;
    jint srcLen = _env->GetArrayLength(_src);
    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);

    RsScriptKernelID* dstkPtr;
    jint dstkLen = _env->GetArrayLength(_dstk);
    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);

    RsScriptKernelID* dstfPtr;
    jint dstfLen = _env->GetArrayLength(_dstf);
    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);

    RsType* typesPtr;
    jint typesLen = _env->GetArrayLength(_types);
    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);

    if (jKernelsPtr == nullptr) {
    if (jKernelsPtr == nullptr) {
        ALOGE("Failed to get Java array elements: kernels");
        ALOGE("Failed to get Java array elements: kernels");
        return 0;
        goto cleanup;
    }
    if (jSrcPtr == nullptr) {
        ALOGE("Failed to get Java array elements: src");
        goto cleanup;
    }
    if (jDstkPtr == nullptr) {
        ALOGE("Failed to get Java array elements: dstk");
        goto cleanup;
    }
    if (jDstfPtr == nullptr) {
        ALOGE("Failed to get Java array elements: dstf");
        goto cleanup;
    }
    }
    RsScriptKernelID* kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
    if (jTypesPtr == nullptr) {
        ALOGE("Failed to get Java array elements: types");
        goto cleanup;
    }

    kernelsPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * kernelsLen);
    for(int i = 0; i < kernelsLen; ++i) {
    for(int i = 0; i < kernelsLen; ++i) {
        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
        kernelsPtr[i] = (RsScriptKernelID)jKernelsPtr[i];
    }
    }


    jint srcLen = _env->GetArrayLength(_src);
    srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
    jlong *jSrcPtr = _env->GetLongArrayElements(_src, nullptr);
    if (jSrcPtr == nullptr) {
        ALOGE("Failed to get Java array elements: src");
        return 0;
    }
    RsScriptKernelID* srcPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * srcLen);
    for(int i = 0; i < srcLen; ++i) {
    for(int i = 0; i < srcLen; ++i) {
        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
        srcPtr[i] = (RsScriptKernelID)jSrcPtr[i];
    }
    }


    jint dstkLen = _env->GetArrayLength(_dstk);
    dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
    jlong *jDstkPtr = _env->GetLongArrayElements(_dstk, nullptr);
    if (jDstkPtr == nullptr) {
        ALOGE("Failed to get Java array elements: dstk");
        return 0;
    }
    RsScriptKernelID* dstkPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstkLen);
    for(int i = 0; i < dstkLen; ++i) {
    for(int i = 0; i < dstkLen; ++i) {
        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
        dstkPtr[i] = (RsScriptKernelID)jDstkPtr[i];
    }
    }


    jint dstfLen = _env->GetArrayLength(_dstf);
    dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
    jlong *jDstfPtr = _env->GetLongArrayElements(_dstf, nullptr);
    if (jDstfPtr == nullptr) {
        ALOGE("Failed to get Java array elements: dstf");
        return 0;
    }
    RsScriptKernelID* dstfPtr = (RsScriptKernelID*) malloc(sizeof(RsScriptKernelID) * dstfLen);
    for(int i = 0; i < dstfLen; ++i) {
    for(int i = 0; i < dstfLen; ++i) {
        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
        dstfPtr[i] = (RsScriptKernelID)jDstfPtr[i];
    }
    }


    jint typesLen = _env->GetArrayLength(_types);
    typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
    jlong *jTypesPtr = _env->GetLongArrayElements(_types, nullptr);
    if (jTypesPtr == nullptr) {
        ALOGE("Failed to get Java array elements: types");
        return 0;
    }
    RsType* typesPtr = (RsType*) malloc(sizeof(RsType) * typesLen);
    for(int i = 0; i < typesLen; ++i) {
    for(int i = 0; i < typesLen; ++i) {
        typesPtr[i] = (RsType)jTypesPtr[i];
        typesPtr[i] = (RsType)jTypesPtr[i];
    }
    }


    jlong id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
    id = (jlong)(uintptr_t)rsScriptGroupCreate((RsContext)con,
                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
                               (RsScriptKernelID *)kernelsPtr, kernelsLen * sizeof(RsScriptKernelID),
                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
                               (RsScriptKernelID *)srcPtr, srcLen * sizeof(RsScriptKernelID),
                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
                               (RsScriptKernelID *)dstkPtr, dstkLen * sizeof(RsScriptKernelID),
@@ -2413,11 +2426,24 @@ nScriptGroupCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _kernels,
    free(dstkPtr);
    free(dstkPtr);
    free(dstfPtr);
    free(dstfPtr);
    free(typesPtr);
    free(typesPtr);

cleanup:
    if (jKernelsPtr != nullptr) {
        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
        _env->ReleaseLongArrayElements(_kernels, jKernelsPtr, 0);
    }
    if (jSrcPtr != nullptr) {
        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
        _env->ReleaseLongArrayElements(_src, jSrcPtr, 0);
    }
    if (jDstkPtr != nullptr) {
        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
        _env->ReleaseLongArrayElements(_dstk, jDstkPtr, 0);
    }
    if (jDstfPtr != nullptr) {
        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
        _env->ReleaseLongArrayElements(_dstf, jDstfPtr, 0);
    }
    if (jTypesPtr != nullptr) {
        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
        _env->ReleaseLongArrayElements(_types, jTypesPtr, 0);
    }

    return id;
    return id;
}
}


@@ -2662,45 +2688,61 @@ nMeshCreate(JNIEnv *_env, jobject _this, jlong con, jlongArray _vtx, jlongArray
        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
        ALOGD("nMeshCreate, con(%p)", (RsContext)con);
    }
    }


    jlong id = 0;

    RsAllocation* vtxPtr;
    jint vtxLen = _env->GetArrayLength(_vtx);
    jint vtxLen = _env->GetArrayLength(_vtx);
    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);
    jlong *jVtxPtr = _env->GetLongArrayElements(_vtx, nullptr);

    RsAllocation* idxPtr;
    jint idxLen = _env->GetArrayLength(_idx);
    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);

    jint primLen = _env->GetArrayLength(_prim);
    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);

    if (jVtxPtr == nullptr) {
    if (jVtxPtr == nullptr) {
        ALOGE("Failed to get Java array elements: vtx");
        ALOGE("Failed to get Java array elements: vtx");
        return 0;
        goto cleanupMesh;
    }
    if (jIdxPtr == nullptr) {
        ALOGE("Failed to get Java array elements: idx");
        goto cleanupMesh;
    }
    if (primPtr == nullptr) {
        ALOGE("Failed to get Java array elements: prim");
        goto cleanupMesh;
    }
    }
    RsAllocation* vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);

    vtxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * vtxLen);
    for(int i = 0; i < vtxLen; ++i) {
    for(int i = 0; i < vtxLen; ++i) {
        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
        vtxPtr[i] = (RsAllocation)(uintptr_t)jVtxPtr[i];
    }
    }


    jint idxLen = _env->GetArrayLength(_idx);
    idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
    jlong *jIdxPtr = _env->GetLongArrayElements(_idx, nullptr);
    if (jIdxPtr == nullptr) {
        ALOGE("Failed to get Java array elements: idx");
        return 0;
    }
    RsAllocation* idxPtr = (RsAllocation*) malloc(sizeof(RsAllocation) * idxLen);
    for(int i = 0; i < idxLen; ++i) {
    for(int i = 0; i < idxLen; ++i) {
        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
        idxPtr[i] = (RsAllocation)(uintptr_t)jIdxPtr[i];
    }
    }


    jint primLen = _env->GetArrayLength(_prim);
    id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
    jint *primPtr = _env->GetIntArrayElements(_prim, nullptr);
    if (primPtr == nullptr) {
        ALOGE("Failed to get Java array elements: prim");
        return 0;
    }

    jlong id = (jlong)(uintptr_t)rsMeshCreate((RsContext)con,
                                        (RsAllocation *)vtxPtr, vtxLen,
                                        (RsAllocation *)vtxPtr, vtxLen,
                                        (RsAllocation *)idxPtr, idxLen,
                                        (RsAllocation *)idxPtr, idxLen,
                                        (uint32_t *)primPtr, primLen);
                                        (uint32_t *)primPtr, primLen);


    free(vtxPtr);
    free(vtxPtr);
    free(idxPtr);
    free(idxPtr);

cleanupMesh:
    if (jVtxPtr != nullptr) {
        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
        _env->ReleaseLongArrayElements(_vtx, jVtxPtr, 0);
    }
    if (jIdxPtr != nullptr) {
        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
        _env->ReleaseLongArrayElements(_idx, jIdxPtr, 0);
    }
    if (primPtr != nullptr) {
        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
        _env->ReleaseIntArrayElements(_prim, primPtr, 0);
    }

    return id;
    return id;
}
}