<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hello All,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Please review the following fix in JDK11 :<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Bug : <a href="https://bugs.openjdk.java.net/browse/JDK-8191073">https://bugs.openjdk.java.net/browse/JDK-8191073</a> <o:p></o:p></p><p class=MsoNormal>Webrev : <a href="http://cr.openjdk.java.net/~jdv/8191073/webrev.00/">http://cr.openjdk.java.net/~jdv/8191073/webrev.00/</a> <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><u>Issue:</u> When we try to read image data from JPEG input stream having tables-only information JPEGImageReader throws IndexOutOfBoundsException.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Exception in thread "main" java.lang.IndexOutOfBoundsException: Index -1 out-of-bounds for length 0 <br>        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) <br>        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) <br>        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) <br>        at java.base/java.util.Objects.checkIndex(Objects.java:372) <br>        at java.base/java.util.ArrayList.get(ArrayList.java:440) <br>        at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:378) <br>        at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:493) <br>        at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:716) <br>        at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1173) <br>        at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1153) <br>        at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1468) <br>        at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1363) <br>        at JpegReaderOOBIssue.main(JpegReaderOOBIssue.java:25)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><u>Root cause:</u> readNativeHeader() function returns the first header as tables-only image in checkTablesOnly() function. Because of this we don’t update the start of this stream position as one of the imagePositions. After that in checkTablesOnly() we try to find any image data after stream metadata using hasNextImage() and it also returns false. So we have a input stream which contains only streamMetadata(tables-only image).<br>In the same checkTablesOnly() we try to get initial imagePosition for this input stream in seekForwardOnly case. But since it is empty and we try "imagePositions.get(imagePositions.size()-1)" it throws IndexOutOfBoundsException.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><u>Solution: <o:p></o:p></u></p><p class=MsoNormal>We should make changes at 2 places to fix this issue :<o:p></o:p></p><p class=MsoNormal>1) In checkTablesOnly() function if seekForward flag is enabled and the input stream is just tables-only we should not try to access imagePositions variable as it will be empty. imagePositions list is in 1:1 relationship with number on image indices available in given input stream. <br><br>2) In checkTablesOnly() function when we get to know that the given input stream is just tables only image we should maintain that state in a boolean variable like “tablesOnlyStream” so that if we try to access image information in gotoImage() we should throw an IIOException mentioning that there is no image data available.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks,<o:p></o:p></p><p class=MsoNormal>Jay<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>