<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;}
@font-face
        {font-family:"Times New Roman \,serif";
        panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
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;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@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 bgcolor=white lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'>Hi Phil,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>I have added public evaluation in bug. Please review.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Jay<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='color:windowtext'>From:</span></b><span style='color:windowtext'> Philip Race <br><b>Sent:</b> Friday, November 13, 2015 12:11 AM<br><b>To:</b> Jayathirth D V<br><b>Cc:</b> Prasanta Sadhukhan; 2d-dev@openjdk.java.net<br><b>Subject:</b> Re: Review request for JDK-6967419 : IndexOutOfBoundsException when drawing PNGs<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Please add a *public* evaluation to the bug report. I will look at it more then ..<br><br>-phil.<br><br>On 11/6/15, 2:20 AM, Jayathirth D V wrote: <span style='font-size:12.0pt'><o:p></o:p></span></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal><span style='color:windowtext'>Hi Prasanta,</span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'> </span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'>As discussed, only in case of write_IDAT there is finally block which calls ios.finish() which internally calls seek() with improper startPos. In other cases we are not trying to access improper startPos because there is no call to ios.finish(). We can verify this behavior by changing logic where we throw IOException in test case.</span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'> </span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'>And I have modified test to not catch IOBE as per your suggestion. Please find updated Webrev link:</span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'> </span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'><a href="http://cr.openjdk.java.net/%7Erchamyal/jay/6967419/webrev.01/"><span style='color:windowtext'>http://cr.openjdk.java.net/~rchamyal/jay/6967419/webrev.01/</span></a></span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'> </span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'>Thanks,</span><o:p></o:p></p><p class=MsoNormal><span style='color:windowtext'>Jay</span><o:p></o:p></p><p class=MsoNormal><span style='color:#1F497D'> </span><o:p></o:p></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b><span style='color:windowtext'>From:</span></b><span style='color:windowtext'> prasanta sadhukhan <br><b>Sent:</b> Friday, November 06, 2015 2:45 PM<br><b>To:</b> Jayathirth D V; <a href="mailto:2d-dev@openjdk.java.net">2d-dev@openjdk.java.net</a><br><b>Cc:</b> Philip Race<br><b>Subject:</b> Re: Review request for JDK-6967419 : IndexOutOfBoundsException when drawing PNGs</span><o:p></o:p></p></div></div><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Hi Jay,<br><br>looks ok but<br>I guess you need to do the same for finish() method too in similar way you did for finishChunk() as finish() is called from write_IHDR, write_CHRM etc and it calls flushBefore().<br>Also, I guess you should not consume IOB Exception and let it be thrown to user instead of RuntimeException after catching IOBE.<br><br>Regards<br>Prasanta<o:p></o:p></p><div><p class=MsoNormal>On 11/5/2015 5:25 PM, Jayathirth D V wrote:<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal>Hello All,<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Please review following fix in jdk9:<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-6967419">https://bugs.openjdk.java.net/browse/JDK-6967419</a><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Webrev : <a href="http://cr.openjdk.java.net/%7Erchamyal/jay/6967419/webrev.00/">http://cr.openjdk.java.net/~rchamyal/jay/6967419/webrev.00/</a><o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Bug : IndexOutOfBoundsException when drawing PNGs<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Root cause : When user intentionally throws IO Exception while write is happening. <br>                          We call ios.finish() in finally block of write_IDAT() which internally goes to finishChunk(). But the startPos of the chunk is still pointing to present IDAT chunk but flushedPos(streamPos) is pointing to end of  IDAT chunk. <br>                          So in finishChunk(), startPos will be less than flushedPos. This is causing IndexOutOfBoundException in stream.seek() and cache is not closed.<o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal>Solution : If IOException is thrown by user, catch the exception while write is happening and update startPos to streamPos. So that when seek() happens in finishChunk() we don’t see IndexOutOfBoundsException and cache is closed properly.<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></blockquote><p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman ,serif",serif'> </span><o:p></o:p></p></blockquote></div></body></html>