提交 6bce7731 编写于 作者: V vadim

8161733: [parfait] Memory leak in imageioJPEG.c:2803

Reviewed-by: prr, serb
上级 42bd8099
...@@ -2634,6 +2634,18 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeTables ...@@ -2634,6 +2634,18 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeTables
RELEASE_ARRAYS(env, data, NULL); 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 JNIEXPORT jboolean JNICALL
Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
(JNIEnv *env, (JNIEnv *env,
...@@ -2742,6 +2754,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2742,6 +2754,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
scale = (UINT8**) calloc(numBands, sizeof(UINT8*)); scale = (UINT8**) calloc(numBands, sizeof(UINT8*));
if (scale == NULL) { if (scale == NULL) {
(*env)->ReleaseIntArrayElements(env, bandSizes,
bandSize, JNI_ABORT);
JNU_ThrowByName( env, "java/lang/OutOfMemoryError", JNU_ThrowByName( env, "java/lang/OutOfMemoryError",
"Writing JPEG Stream"); "Writing JPEG Stream");
return JNI_FALSE; return JNI_FALSE;
...@@ -2758,6 +2772,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2758,6 +2772,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
free(scale[j]); free(scale[j]);
} }
free(scale); free(scale);
(*env)->ReleaseIntArrayElements(env, bandSizes,
bandSize, JNI_ABORT);
JNU_ThrowByName( env, "java/lang/OutOfMemoryError", JNU_ThrowByName( env, "java/lang/OutOfMemoryError",
"Writing JPEG Stream"); "Writing JPEG Stream");
return JNI_FALSE; return JNI_FALSE;
...@@ -2782,21 +2798,14 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2782,21 +2798,14 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
pb = &data->pixelBuf; pb = &data->pixelBuf;
if (setPixelBuffer(env, pb, buffer) == NOT_OK) { if (setPixelBuffer(env, pb, buffer) == NOT_OK) {
if (scale != NULL) { freeArray(scale, numBands);
for (i = 0; i < numBands; i++) {
if (scale[i] != NULL) {
free(scale[i]);
}
}
free(scale);
}
return data->abortFlag; // We already threw an out of memory exception return data->abortFlag; // We already threw an out of memory exception
} }
// Allocate a 1-scanline buffer // Allocate a 1-scanline buffer
scanLinePtr = (JSAMPROW)malloc(scanLineSize); scanLinePtr = (JSAMPROW)malloc(scanLineSize);
if (scanLinePtr == NULL) { if (scanLinePtr == NULL) {
RELEASE_ARRAYS(env, data, (const JOCTET *)(dest->next_output_byte)); freeArray(scale, numBands);
JNU_ThrowByName( env, JNU_ThrowByName( env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Writing JPEG Stream"); "Writing JPEG Stream");
...@@ -2818,15 +2827,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2818,15 +2827,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
JNU_ThrowByName(env, "javax/imageio/IIOException", buffer); JNU_ThrowByName(env, "javax/imageio/IIOException", buffer);
} }
if (scale != NULL) { freeArray(scale, numBands);
for (i = 0; i < numBands; i++) {
if (scale[i] != NULL) {
free(scale[i]);
}
}
free(scale);
}
free(scanLinePtr); free(scanLinePtr);
return data->abortFlag; return data->abortFlag;
} }
...@@ -2874,7 +2875,11 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2874,7 +2875,11 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
if (qsels) { if (qsels) {
(*env)->ReleaseIntArrayElements(env, QtableSelectors, qsels, JNI_ABORT); (*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 jpeg_suppress_tables(cinfo, TRUE); // Disable writing any current
...@@ -2892,6 +2897,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2892,6 +2897,8 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
if (GET_ARRAYS(env, data, if (GET_ARRAYS(env, data,
(const JOCTET **)(&dest->next_output_byte)) == NOT_OK) { (const JOCTET **)(&dest->next_output_byte)) == NOT_OK) {
(*env)->ExceptionClear(env); (*env)->ExceptionClear(env);
freeArray(scale, numBands);
free(scanLinePtr);
JNU_ThrowByName(env, JNU_ThrowByName(env,
"javax/imageio/IIOException", "javax/imageio/IIOException",
"Array pin failed"); "Array pin failed");
...@@ -2926,7 +2933,12 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -2926,7 +2933,12 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
cinfo->scan_info = cinfo->script_space; cinfo->scan_info = cinfo->script_space;
scanptr = (int *) cinfo->script_space; scanptr = (int *) cinfo->script_space;
scanData = (*env)->GetIntArrayElements(env, scanInfo, NULL); 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 // number of jints per scan is 9
// We avoid a memcpy to handle different size ints // We avoid a memcpy to handle different size ints
for (i = 0; i < numScans*9; i++) { for (i = 0; i < numScans*9; i++) {
...@@ -3022,15 +3034,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage ...@@ -3022,15 +3034,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_writeImage
jpeg_abort((j_common_ptr)cinfo); jpeg_abort((j_common_ptr)cinfo);
} }
if (scale != NULL) { freeArray(scale, numBands);
for (i = 0; i < numBands; i++) {
if (scale[i] != NULL) {
free(scale[i]);
}
}
free(scale);
}
free(scanLinePtr); free(scanLinePtr);
RELEASE_ARRAYS(env, data, NULL); RELEASE_ARRAYS(env, data, NULL);
return data->abortFlag; return data->abortFlag;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册