Hi Jay,

looks ok but
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(). Also, I guess you should not consume IOB Exception and let it be thrown to user instead of RuntimeException after catching IOBE.

Regards
Prasanta
On 11/5/2015 5:25 PM, Jayathirth D V wrote:

Hello All,

Please review following fix in jdk9:

Bug : https://bugs.openjdk.java.net/browse/JDK-6967419

Webrev : http://cr.openjdk.java.net/~rchamyal/jay/6967419/webrev.00/

Bug : IndexOutOfBoundsException when drawing PNGs

Root cause : When user intentionally throws IO Exception while write is happening. 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. So in finishChunk(), startPos will be less than flushedPos. This is causing IndexOutOfBoundException in stream.seek() and cache is not closed.

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.

Thanks,

Jay


Reply via email to