[OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException

Prasanta Sadhukhan prasanta.sadhukhan at oracle.com
Tue Nov 21 10:45:36 UTC 2017


+1

Regards
Prasanta
On 11/21/2017 9:06 AM, Prahalad Kumar Narayanan wrote:
> Hello Jay
>
> The change looks good.
>
> Thanks
> Have a good day
>
> Prahalad
>
> -----Original Message-----
> From: Jayathirth D V
> Sent: Tuesday, November 21, 2017 9:01 AM
> To: Prahalad Kumar Narayanan; 2d-dev
> Subject: RE: [OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException
>
> Hi Prahalad,
>
> Thanks for the review.
> I merged the two functions into one instead of moving BufferedImage code into the two functions as it reduces the LOC by good amount.
>
> Please find updated webrev for review:
> http://cr.openjdk.java.net/~jdv/8191431/webrev.02/
>
> Thanks,
> Jay
>
> -----Original Message-----
> From: Prahalad Kumar Narayanan
> Sent: Tuesday, November 21, 2017 8:13 AM
> To: Jayathirth D V; 2d-dev
> Subject: RE: [OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException
>
> Hello Jay
>
> Good day to you. I looked into the modified test code.
>
> The test file has two methods ( writeAndReadImageWithPalette & writeAndReadImageWithoutPalette ) with exactly the same implementation.
>      . Can we merge them into one method ?
>      . Another option would be to move the logic that prepares required buffered image within these methods.
>
>    86     private static void writeAndReadImageWithoutPalette(BufferedImage image)
>    87             throws IOException {
>    88         File output = File.createTempFile("output", ".png");
>    89         ImageInputStream stream = null;
>    90         try {
>    91             ImageIO.write(image, "png", output);
>    92
>    93             stream = ImageIO.createImageInputStream(output);
>    94             ImageReadParam param = PNG_READER.getDefaultReadParam();
>    95             PNG_READER.setInput(stream, true, true);
>    96             PNG_READER.read(0, param);
>    97         } finally {
>    98             if (stream != null) {
>    99                 stream.close();
>   100             }
>   101             Files.delete(output.toPath());
>   102         }
>   103     }
>
>   105     private static void writeAndReadImageWithPalette(BufferedImage image)
>   106             throws IOException {
>   107         File output = File.createTempFile("output", ".png");
>   108         ImageInputStream stream = null;
>   109         try {
>   110             ImageIO.write(image, "png", output);
>   111
>   112             stream = ImageIO.createImageInputStream(output);
>   113             ImageReadParam param = PNG_READER.getDefaultReadParam();
>   114             PNG_READER.setInput(stream, true, true);
>   115             PNG_READER.read(0, param);
>   116         } finally {
>   117             if (stream != null) {
>   118                 stream.close();
>   119             }
>   120             Files.delete(output.toPath());
>   121         }
>   122     }
>   123 }
>
> Thank you
> Have a good day
>
> Prahalad
>
> -----Original Message-----
> From: Jayathirth D V
> Sent: Monday, November 20, 2017 6:18 PM
> To: Prahalad Kumar Narayanan; 2d-dev
> Subject: RE: [OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException
>
> Hi Prahalad,
>
> Thanks for the review.
> I have updated the test case.
>
> Please find updated webrev for review:
> http://cr.openjdk.java.net/~jdv/8191431/webrev.01/
>
> Thanks,
> Jay
>
> -----Original Message-----
> From: Prahalad Kumar Narayanan
> Sent: Monday, November 20, 2017 5:25 PM
> To: Jayathirth D V; 2d-dev
> Subject: RE: [OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException
>
> Hello Jay
>
> The code change at PNGImageReader is correct.
> But the test wouldn't delete temporary files when exception occurs.
>
> Thank you
> Have a good day
>
> Prahalad
>
> ----- Original Message -----
> From: Jayathirth D V
> Sent: Monday, November 20, 2017 4:34 PM
> To: 2d-dev
> Subject: [OpenJDK 2D-Dev] [10] RFR JDK-8191431: Reading multiple PNG images with unique IDAT chunk positions will cause IIOException
>
> Hello All,
>
> Please review the following fix in JDK10 :
>
> Bug : https://bugs.openjdk.java.net/browse/JDK-8191431
> Webrev : http://cr.openjdk.java.net/~jdv/8191431/webrev.00/
>
> Issue : When we try to read multiple PNG images with different IDAT chunk positions using the same PNGImageReader instance we get "IIOException: Error reading PNG image data".
>
> Root cause : Issue is happening because of changes present in JDK-8164971.
>                  Under JDK-8164971 we have made changes such that imageStartPosition for IDAT chunk will be updated only once for a given PNGImageReader instance while reading metadata.
>                  case IDAT_TYPE:
>                      // If chunk type is 'IDAT', we've reached the image data.
>                      if (imageStartPosition == -1L) {
>                          /*
>                           * PNGs may contain multiple IDAT chunks containing
>                           * a portion of image data. We store the position of
>                           * the first IDAT chunk and continue with iteration
>                           * of other chunks that follow image data.
>                           */
>                          imageStartPosition = stream.getStreamPosition() - 8;
>                     }
>
>                  When we use same PNGImageReader instance to read another PNG image and if IDAT chunk position and length differs we will get IIOException.
>
> Solution : We already have resetStreamSettings() method which we call when user tries to decode an image under ImageReader.setInput(). In resetStreamSettings() function if we initialize imageStartPosition to '-1L' it will resolve this issue.
>
> Thanks,
> Jay



More information about the 2d-dev mailing list