--- old/modules/javafx.graphics/src/main/native-iio/jpegloader.c 2018-10-01 15:50:12.661500688 +0530 +++ new/modules/javafx.graphics/src/main/native-iio/jpegloader.c 2018-10-01 15:50:12.445500688 +0530 @@ -1338,6 +1338,8 @@ char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) ((struct jpeg_common_struct *) cinfo, buffer); + free(cinfo); + free(jerr_mgr); ThrowByName(env, "java/io/IOException", buffer); return 0; } @@ -1355,6 +1357,8 @@ cinfo->src = (struct jpeg_source_mgr *) malloc(sizeof (struct jpeg_source_mgr)); if (cinfo->src == NULL) { + free(cinfo); + free(jerr_mgr); ThrowByName(env, "java/lang/OutOfMemoryError", "Initializing Reader"); @@ -1371,6 +1375,9 @@ /* set up the association to persist for future calls */ data = initImageioData(env, (j_common_ptr) cinfo, this); if (data == NULL) { + free(cinfo->src); + free(cinfo); + free(jerr_mgr); ThrowByName(env, "java/lang/OutOfMemoryError", "Initializing Reader"); @@ -1379,7 +1386,12 @@ imageio_set_stream(env, (j_common_ptr) cinfo, data, stream); - if ((*env)->ExceptionCheck(env)) return 0; + if ((*env)->ExceptionCheck(env)) { + free(cinfo->src); + free(cinfo); + free(jerr_mgr); + return 0; + } imageio_init_source((j_decompress_ptr) cinfo); @@ -1397,10 +1409,17 @@ buffer); ThrowByName(env, "java/io/IOException", buffer); } + free(cinfo->src); + free(cinfo); + free(jerr_mgr); return 0; } if (GET_ARRAYS(env, data, &src->next_input_byte) == NOT_OK) { + RELEASE_ARRAYS(env, data, src->next_input_byte); + free(cinfo->src); + free(cinfo); + free(jerr_mgr); ThrowByName(env, "java/io/IOException", "Array pin failed"); @@ -1500,6 +1519,9 @@ profileData = read_icc_profile(env, cinfo); if ((*env)->ExceptionCheck(env)) { + free(cinfo->src); + free(cinfo); + free(jerr_mgr); return 0; } @@ -1512,6 +1534,9 @@ cinfo->num_components, profileData); if ((*env)->ExceptionCheck(env)) { + free(cinfo->src); + free(cinfo); + free(jerr_mgr); return 0; } } @@ -1606,14 +1631,22 @@ struct jpeg_source_mgr *src = cinfo->src; sun_jpeg_error_ptr jerr; int bytes_per_row = cinfo->output_width * cinfo->output_components; - JSAMPROW scanline_ptr = (JSAMPROW) malloc(bytes_per_row * sizeof (JSAMPLE)); int offset = 0; + JSAMPROW scanline_ptr = (JSAMPROW) malloc(bytes_per_row * sizeof (JSAMPLE)); + + if (scanline_ptr == NULL) { + ThrowByName(env, + "java/lang/OutOfMemoryError", + "Reading JPEG Stream"); + return JNI_FALSE; + } if (!SAFE_TO_MULT(cinfo->output_width, cinfo->output_components) || !SAFE_TO_MULT(bytes_per_row, cinfo->output_height) || ((*env)->GetArrayLength(env, barray) < (bytes_per_row * cinfo->output_height))) { + free(scanline_ptr); ThrowByName(env, "java/lang/OutOfMemoryError", "Reading JPEG Stream"); @@ -1621,20 +1654,13 @@ } if (GET_ARRAYS(env, data, &cinfo->src->next_input_byte) == NOT_OK) { + free(scanline_ptr); ThrowByName(env, "java/io/IOException", "Array pin failed"); return JNI_FALSE; } - if (scanline_ptr == NULL) { - ThrowByName(env, - "java/lang/OutOfMemoryError", - "Reading JPEG Stream"); - RELEASE_ARRAYS(env, data, cinfo->src->next_input_byte); - return JNI_FALSE; - } - /* Establish the setjmp return context for sun_jpeg_error_exit to use. */ jerr = (sun_jpeg_error_ptr) cinfo->err; @@ -1647,9 +1673,7 @@ buffer); ThrowByName(env, "java/io/IOException", buffer); } - if (scanline_ptr != NULL) { - free(scanline_ptr); - } + free(scanline_ptr); RELEASE_ARRAYS(env, data, cinfo->src->next_input_byte); return JNI_FALSE; } @@ -1661,11 +1685,15 @@ (*env)->CallVoidMethod(env, this, JPEGImageLoader_updateImageProgressID, cinfo->output_scanline); - if ((*env)->ExceptionCheck(env)) return JNI_FALSE; + if ((*env)->ExceptionCheck(env)) { + free(scanline_ptr); + return JNI_FALSE; + } if (GET_ARRAYS(env, data, &cinfo->src->next_input_byte) == NOT_OK) { ThrowByName(env, "java/io/IOException", "Array pin failed"); + free(scanline_ptr); return JNI_FALSE; } } @@ -1676,6 +1704,8 @@ jbyte *body = (*env)->GetPrimitiveArrayCritical(env, barray, &iscopy); if (body == NULL) { fprintf(stderr, "decompressIndirect: GetPrimitiveArrayCritical returns NULL: out of memory\n"); + free(scanline_ptr); + RELEASE_ARRAYS(env, data, cinfo->src->next_input_byte); return JNI_FALSE; } memcpy(body+offset,scanline_ptr, bytes_per_row); @@ -1689,13 +1719,17 @@ (*env)->CallVoidMethod(env, this, JPEGImageLoader_updateImageProgressID, cinfo->output_height); - if ((*env)->ExceptionCheck(env)) return JNI_FALSE; - if (GET_ARRAYS(env, data, &cinfo->src->next_input_byte) == NOT_OK) { - ThrowByName(env, + if ((*env)->ExceptionCheck(env)) { + free(scanline_ptr); + return JNI_FALSE; + } + if (GET_ARRAYS(env, data, &cinfo->src->next_input_byte) == NOT_OK) { + ThrowByName(env, "java/io/IOException", "Array pin failed"); - return JNI_FALSE; - } + free(scanline_ptr); + return JNI_FALSE; + } } jpeg_finish_decompress(cinfo);