diff --git a/src/share/native/sun/awt/image/jpeg/imageioJPEG.c b/src/share/native/sun/awt/image/jpeg/imageioJPEG.c index 342fe265de4da42e2e755c22f03554195cdc54f0..1374372865aa39b45c0f15bd7c2caefe3bb6eb2a 100644 --- a/src/share/native/sun/awt/image/jpeg/imageioJPEG.c +++ b/src/share/native/sun/awt/image/jpeg/imageioJPEG.c @@ -2634,6 +2634,18 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeTables RELEASE_ARRAYS(env, data, NULL); } +static void freeArray(void** arr, jint size) { + int i; + if (arr != NULL) { + for (i = 0; i < size; i++) { + if (arr[i] != NULL) { + free(arr[i]); + } + } + free(arr); + } +} + JNIEXPORT jboolean JNICALL Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage (JNIEnv *env, @@ -2742,6 +2754,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage scale = (UINT8**) calloc(numBands, sizeof(UINT8*)); if (scale == NULL) { + (*env)->ReleaseIntArrayElements(env, bandSizes, + bandSize, JNI_ABORT); JNU_ThrowByName( env, "java/lang/OutOfMemoryError", "Writing JPEG Stream"); return JNI_FALSE; @@ -2758,6 +2772,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage free(scale[j]); } free(scale); + (*env)->ReleaseIntArrayElements(env, bandSizes, + bandSize, JNI_ABORT); JNU_ThrowByName( env, "java/lang/OutOfMemoryError", "Writing JPEG Stream"); return JNI_FALSE; @@ -2782,21 +2798,14 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage pb = &data->pixelBuf; if (setPixelBuffer(env, pb, buffer) == NOT_OK) { - if (scale != NULL) { - for (i = 0; i < numBands; i++) { - if (scale[i] != NULL) { - free(scale[i]); - } - } - free(scale); - } + freeArray(scale, numBands); return data->abortFlag; // We already threw an out of memory exception } // Allocate a 1-scanline buffer scanLinePtr = (JSAMPROW)malloc(scanLineSize); if (scanLinePtr == NULL) { - RELEASE_ARRAYS(env, data, (const JOCTET *)(dest->next_output_byte)); + freeArray(scale, numBands); JNU_ThrowByName( env, "java/lang/OutOfMemoryError", "Writing JPEG Stream"); @@ -2818,15 +2827,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage JNU_ThrowByName(env, "javax/imageio/IIOException", buffer); } - if (scale != NULL) { - for (i = 0; i < numBands; i++) { - if (scale[i] != NULL) { - free(scale[i]); - } - } - free(scale); - } - + freeArray(scale, numBands); free(scanLinePtr); return data->abortFlag; } @@ -2874,7 +2875,11 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage if (qsels) { (*env)->ReleaseIntArrayElements(env, QtableSelectors, qsels, JNI_ABORT); } - if (!success) return data->abortFlag; + if (!success) { + freeArray(scale, numBands); + free(scanLinePtr); + return data->abortFlag; + } jpeg_suppress_tables(cinfo, TRUE); // Disable writing any current @@ -2892,6 +2897,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage if (GET_ARRAYS(env, data, (const JOCTET **)(&dest->next_output_byte)) == NOT_OK) { (*env)->ExceptionClear(env); + freeArray(scale, numBands); + free(scanLinePtr); JNU_ThrowByName(env, "javax/imageio/IIOException", "Array pin failed"); @@ -2926,7 +2933,12 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage cinfo->scan_info = cinfo->script_space; scanptr = (int *) cinfo->script_space; scanData = (*env)->GetIntArrayElements(env, scanInfo, NULL); - CHECK_NULL_RETURN(scanData, data->abortFlag); + if (scanData == NULL) { + RELEASE_ARRAYS(env, data, (const JOCTET *)(dest->next_output_byte)); + freeArray(scale, numBands); + free(scanLinePtr); + return data->abortFlag; + } // number of jints per scan is 9 // We avoid a memcpy to handle different size ints for (i = 0; i < numScans*9; i++) { @@ -3022,15 +3034,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage jpeg_abort((j_common_ptr)cinfo); } - if (scale != NULL) { - for (i = 0; i < numBands; i++) { - if (scale[i] != NULL) { - free(scale[i]); - } - } - free(scale); - } - + freeArray(scale, numBands); free(scanLinePtr); RELEASE_ARRAYS(env, data, NULL); return data->abortFlag;