From 8951cf01fe61d09a3b3a77d704f43cb4f2afb096 Mon Sep 17 00:00:00 2001 From: DRC Date: Thu, 14 Aug 2014 16:54:04 +0000 Subject: [PATCH] Clean up exception handling in the JNI code. The exception is actually not thrown until the function exits, so we can let the code fall through to bailout: if the TurboJPEG C function fails. Also, per the JNI spec, no other JNI functions can be called between GetPrimitiveArrayCritical() and ReleasePrimitiveArrayCritical(). This hasn't caused any problems thus far, but better safe than sorry. git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1346 632fc199-4ca6-4c93-a231-07263d6284db --- turbojpeg-jni.c | 79 +++++++++---------------------------------------- 1 file changed, 14 insertions(+), 65 deletions(-) diff --git a/turbojpeg-jni.c b/turbojpeg-jni.c index 4b5578ff..53bdceba 100644 --- a/turbojpeg-jni.c +++ b/turbojpeg-jni.c @@ -134,12 +134,7 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 if(tjCompress2(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, flags|TJFLAG_NOREALLOC)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - jpegBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); @@ -191,12 +186,7 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3 if(tjCompress2(handle, &srcBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(jint), height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, flags|TJFLAG_NOREALLOC)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - jpegBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); @@ -237,12 +227,7 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFrom if(tjCompressFromYUV(handle, srcBuf, width, pad, height, subsamp, &jpegBuf, &jpegSize, jpegQual, flags|TJFLAG_NOREALLOC)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - jpegBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); @@ -282,12 +267,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___ if(tjEncodeYUV3(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height, pf, dstBuf, pad, subsamp, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - dstBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -337,12 +317,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___ if(tjEncodeYUV3(handle, &srcBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(jint), height, pf, dstBuf, pad, subsamp, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - dstBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -433,10 +408,8 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if(tjDecompressHeader3(handle, jpegBuf, (unsigned long)jpegSize, &width, &height, &jpegSubsamp, &jpegColorspace)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); _throw(tjGetErrorStr()); - } + (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); jpegBuf=NULL; bailif0(_fid=(*env)->GetFieldID(env, _cls, "srcSubsamp", "I")); @@ -449,6 +422,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress (*env)->SetIntField(env, obj, _fid, height); bailout: + if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); return; } @@ -480,12 +454,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height, pf, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); - dstBuf=jpegBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -531,12 +500,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, &dstBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(jint), height, pf, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); - dstBuf=jpegBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -584,12 +548,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress if(tjDecompressToYUV2(handle, jpegBuf, (unsigned long)jpegSize, dstBuf, desiredWidth, pad, desiredHeight, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); - dstBuf=jpegBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -635,12 +594,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV_ if(tjDecodeYUV(handle, srcBuf, pad, subsamp, &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height, pf, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - dstBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -680,12 +634,7 @@ JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV_ if(tjDecodeYUV(handle, srcBuf, pad, subsamp, &dstBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(jint), height, pf, flags)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); - (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); - dstBuf=srcBuf=NULL; _throw(tjGetErrorStr()); - } bailout: if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); @@ -851,7 +800,6 @@ JNIEXPORT jintArray JNICALL Java_org_libjpegturbo_turbojpeg_TJTransformer_transf } } - bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, jsrcBuf, 0)); for(i=0; iGetArrayLength(env, jdstBufs[i]) GetPrimitiveArrayCritical(env, jdstBufs[i], 0)); } + bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, jsrcBuf, 0)); + for(i=0; iGetPrimitiveArrayCritical(env, jdstBufs[i], 0)); if(tjTransform(handle, jpegBuf, jpegSize, n, dstBufs, dstSizes, t, flags|TJFLAG_NOREALLOC)==-1) - { - (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); - jpegBuf=NULL; - for(i=0; iReleasePrimitiveArrayCritical(env, jdstBufs[i], dstBufs[i], 0); - dstBufs[i]=NULL; - } _throw(tjGetErrorStr()); + + for(i=0; iReleasePrimitiveArrayCritical(env, jdstBufs[i], dstBufs[i], 0); + dstBufs[i]=NULL; } + (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); + jpegBuf=NULL; jdstSizes=(*env)->NewIntArray(env, n); bailif0(dstSizesi=(*env)->GetIntArrayElements(env, jdstSizes, 0)); for(i=0; iReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); + if(dstSizesi) (*env)->ReleaseIntArrayElements(env, jdstSizes, dstSizesi, 0); if(dstBufs) { for(i=0; iReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); if(jdstBufs) free(jdstBufs); if(dstSizes) free(dstSizes); - if(dstSizesi) (*env)->ReleaseIntArrayElements(env, jdstSizes, dstSizesi, 0); if(t) free(t); return jdstSizes; }