提交 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
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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册