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

Commit 74c2598c authored by Adam Bodnar's avatar Adam Bodnar
Browse files

Fix pointer arithmetic for ByteBuffers with non-zero positions

When initializing a gpu resource from a Java ByteBuffer with a non-zero
position, most functions aren't releasing the correct pointer and
subsequently crash the app.

Bug: 67109954
Test: build, flash, atest android.opengl.cts.ByteBufferTest

Change-Id: Id0910efd8c5ed6e00ea10eab89e77d97fe642d2b
parent 68a510ac
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -640,7 +640,7 @@ android_glCompressedTexImage2D__IIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -684,7 +684,7 @@ android_glCompressedTexSubImage2D__IIIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -929,7 +929,7 @@ android_glDrawElements__IIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, indices, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)indices - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -2801,7 +2801,8 @@ android_glReadPixels__IIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, pixels, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -3241,7 +3242,7 @@ android_glTexImage2D__IIIIIIIILjava_nio_Buffer_2
        (GLvoid *)pixels
    );
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -3301,7 +3302,7 @@ android_glTexSubImage2D__IIIIIIIILjava_nio_Buffer_2
        (GLvoid *)pixels
    );
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
+2 −2
Original line number Diff line number Diff line
@@ -464,7 +464,7 @@ android_glBufferData__IILjava_nio_Buffer_2I

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -509,7 +509,7 @@ android_glBufferSubData__IIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
+4 −2
Original line number Diff line number Diff line
@@ -893,7 +893,8 @@ android_glEGLImageTargetTexture2DOES__ILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, image, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _array, (void *)((char *)image - _bufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -930,7 +931,8 @@ android_glEGLImageTargetRenderbufferStorageOES__ILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, image, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _array, (void *)((char *)image - _bufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
+12 −10
Original line number Diff line number Diff line
@@ -599,7 +599,7 @@ android_glBufferData__IILjava_nio_Buffer_2I

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -644,7 +644,7 @@ android_glBufferSubData__IIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -758,7 +758,7 @@ android_glCompressedTexImage2D__IIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -802,7 +802,7 @@ android_glCompressedTexSubImage2D__IIIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -1379,7 +1379,7 @@ android_glDrawElements__IIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, indices, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)indices - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -4273,7 +4273,8 @@ android_glReadPixels__IIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, pixels, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -4380,7 +4381,7 @@ android_glShaderBinary__I_3IIILjava_nio_Buffer_2I

exit:
    if (_array) {
        releasePointer(_env, _array, binary, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)binary - _bufferOffset), JNI_FALSE);
    }
    if (shaders_base) {
        _env->ReleaseIntArrayElements(shaders_ref, (jint*)shaders_base,
@@ -4445,7 +4446,8 @@ android_glShaderBinary__ILjava_nio_IntBuffer_2ILjava_nio_Buffer_2I

exit:
    if (_binaryArray) {
        releasePointer(_env, _binaryArray, binary, JNI_FALSE);
        releasePointer(_env, _binaryArray, (void *)((char *)binary - _binaryBufferOffset),
                       JNI_FALSE);
    }
    if (_shadersArray) {
        _env->ReleaseIntArrayElements(_shadersArray, (jint*)shaders, JNI_ABORT);
@@ -4568,7 +4570,7 @@ android_glTexImage2D__IIIIIIIILjava_nio_Buffer_2
        (GLvoid *)pixels
    );
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -4816,7 +4818,7 @@ android_glTexSubImage2D__IIIIIIIILjava_nio_Buffer_2
        (GLvoid *)pixels
    );
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
+10 −8
Original line number Diff line number Diff line
@@ -463,7 +463,7 @@ android_glDrawRangeElements__IIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, indices, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)indices - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -516,7 +516,7 @@ android_glTexImage3D__IIIIIIIIILjava_nio_Buffer_2
        (GLvoid *)pixels
    );
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -580,7 +580,7 @@ android_glTexSubImage3D__IIIIIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, pixels, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)pixels - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -660,7 +660,7 @@ android_glCompressedTexImage3D__IIIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -723,7 +723,7 @@ android_glCompressedTexSubImage3D__IIIIIIIIIILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, data, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)data - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
@@ -5445,7 +5445,8 @@ android_glGetProgramBinary__II_3II_3IILjava_nio_Buffer_2

exit:
    if (_array) {
        releasePointer(_env, _array, binary, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _array, (void *)((char *)binary - _bufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (binaryFormat_base) {
        _env->ReleaseIntArrayElements(binaryFormat_ref, (jint*)binaryFormat_base,
@@ -5519,7 +5520,8 @@ android_glGetProgramBinary__IILjava_nio_IntBuffer_2Ljava_nio_IntBuffer_2Ljava_ni

exit:
    if (_binaryArray) {
        releasePointer(_env, _binaryArray, binary, _exception ? JNI_FALSE : JNI_TRUE);
        releasePointer(_env, _binaryArray, (void *)((char *)binary - _binaryBufferOffset),
                       _exception ? JNI_FALSE : JNI_TRUE);
    }
    if (_binaryFormatArray) {
        _env->ReleaseIntArrayElements(_binaryFormatArray, (jint*)binaryFormat, _exception ? JNI_ABORT : 0);
@@ -5564,7 +5566,7 @@ android_glProgramBinary__IILjava_nio_Buffer_2I

exit:
    if (_array) {
        releasePointer(_env, _array, binary, JNI_FALSE);
        releasePointer(_env, _array, (void *)((char *)binary - _bufferOffset), JNI_FALSE);
    }
    if (_exception) {
        jniThrowException(_env, _exceptionType, _exceptionMessage);
Loading