--- a/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c Tue Jul 26 14:19:15 2016 +0300
+++ b/jdk/src/java.desktop/share/native/libjavajpeg/imageioJPEG.c Tue Jul 26 14:19:40 2016 +0300
@@ -2634,6 +2634,18 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;