Hello Jay

Good day to you. I looked into the changes. 
Here are my views-

    . As per the code changes in the lines mentioned below, every "Throwable" 
(other than the 4 exceptions listed in the first catch block) is considered- 
"BufferOverflow/OOM".  This is incorrect.
          . Say for example, a future change to code within readImage method 
resulted in a NullPointerException, this would get incorrectly reported as- 
BufferOverflow/ OOM as per the changes.

    . Secondly, throwing one IIOException with a combined message will confuse 
the programmer- Was it OOM ? or was it BufferOverflow that caused the reader to 
exit ? 
          . If the intent is to process and throw IIOException with meaningful 
message, I believe, we should handle them separately and throw one IIOException 
for each with a suitable message.

    1675         } catch (IOException |
    1676                  IndexOutOfBoundsException |
    1677                  IllegalStateException |
    1678                  IllegalArgumentException e)
    1679         {
    1680             throw e;
    1681         } catch (Throwable e) {
    1682             throw new IIOException("BufferOverflow/OOM while reading"
    1683                     + " the image");
    1684         }

Thanks
Have a good day

Prahalad

----- Original Message -----
From: Jayathirth D V 
Sent: Monday, November 13, 2017 2:53 PM
To: 2d-dev
Subject: [OpenJDK 2D-Dev] [10] RFR JDK-8190332: PngReader throws 
NegativeArraySizeException/OOM error when IHDR width is very large

Hello All,

Please review the following fix in JDK10 :

Bug : https://bugs.openjdk.java.net/browse/JDK-8190332 
Webrev : http://cr.openjdk.java.net/~jdv/8190332/webrev.00/ 

Issue : 
       Two types of issues are fixed under the same solution, so JDK-8190511 is 
closed as duplicate of this issue.
       1) PNGImageReader throws OOM error when IHDR width equals/or greater 
than VM's array size limit.
       2) PNGImageReader throws NegativeArraySizeException when IHDR width 
value is very high.

Root cause : 
1) VM doesn't allow creation of array with Size >= ((2 to the power of 31) - 2) 
so we throw OOM error.
2) We use width from IHDR to calculate needed "bytesPerRow" value as 
"(inputBands*passWidth*bitDepth + 7)/8". When IHDR width is very high we 
overflow the integer size of bytesPerRow and when we try to create array using 
bytesPerRow it throws NegativeArraySizeException.

Solution :
       According to PNG spec maximum value that can be stored in IHDR 
width/height is (2 to the power of 31). We can't support PNG images with so 
large height/width, because based on other parameters like inputsBands, 
bitDepth we will definitely           overflow than the maximum buffer value of 
VM. Also PNG is not a preferred format for such kind of large images.
                Instead of catching these OOMError/NegativeArraySizeException 
at many different levels in PNGImageReader we can catch Throwable at higher 
level and convert OOMError/ NegativeArraySizeException into IIOException.

Thanks,
Jay

Reply via email to