Thanks for the review Sergey. Can I get +1 for this please? -Jay
-----Original Message----- From: Sergey Bylokhov Sent: Tuesday, March 22, 2016 9:52 PM To: Jayathirth D V; Philip Race Cc: 2d-dev@openjdk.java.net Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-8044289 : In ImageIO.read() and write() NPE is not handled properly for stream This fix looks fine to me. At least it made all code work in a similar way. But probably someone will have other opinion? On 22.03.16 12:34, Jayathirth D V wrote: > Hi Sergey, > > I have unified changes related to ImageIO.read() and ImageIO.write(). > > In case of read() we will be returning null when createImageInputStream() > returns null. > In case of write() we will be returning false when createImageOutputStream() > returns null. > > Please find updated webrev for review: > http://cr.openjdk.java.net/~jdv/8044289/webrev.03/ > > Thanks, > Jay > > -----Original Message----- > From: Sergey Bylokhov > Sent: Tuesday, March 22, 2016 7:39 AM > To: Jayathirth D V; Philip Race > Cc: 2d-dev@openjdk.java.net > Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-8044289 : In > ImageIO.read() and write() NPE is not handled properly for stream > > Hi, Jay. > Since we decided to update the specification we get an additional flexibility > in the fix, because we can update the "@exception IOException" part of > javadoc and describe that it can be thrown if ImageXXXStream cannot be > created. > > I don't see a big differences of both approaches in case of write() methods, > but in case of read(which has the similar issue but was skipped in the fix) > there is a difference. > Note that the read(File) unlike other methods throws the unspecified > IIOException exception if ImageXXXStream cannot be created. We can > think about unification of read/write methods in ImageIO. Hmm but even > then > read() in some cases will return null and in some cases throw an exception.... > and createImageInputStream/createImageOutputStream() will look alien as they > always return null not an exception. > > Another possible unification is to update javadoc for all methods, > that they will return null if related providers are not found(in this > case "throw new IIOException("Can't create an ImageInputStream!"))" > should be removed from read(File); > > On 21.03.16 10:26, Jayathirth D V wrote: >> Hi Sergey, >> >> For the second approach I have created webrev for review. >> >> Please review updated webrev : >> http://cr.openjdk.java.net/~jdv/8044289/webrev.02/ >> >> Thanks, >> Jay >> >> -----Original Message----- >> From: Jayathirth D V >> Sent: Friday, March 18, 2016 2:23 PM >> To: Sergey Bylokhov >> Cc: 2d-dev@openjdk.java.net; Philip Race >> Subject: RE: [OpenJDK 2D-Dev] Review Request for JDK-8044289 : In >> ImageIO.read() and write() NPE is not handled properly for stream >> >> Hi Sergey, >> >> Thanks for your inputs. >> >> Indeed all the null values returned by createImageInputStream() and >> createImageInputStream() are valid only. >> >> I went through the code more and found that there is no need for fix in >> ImageIO.read() methods as null stream is handled in read(ImageInputStream >> stream) which is called by all the remaining read() API's through IAE. So i >> can remove the changes made in ImageIO.read() functions. Also istream is >> closed in finally block of read(url). >> >> For ImageIO.write(File) & ImageIO.write(OutputStream) NPE we have two >> approaches for fix: >> >> 1) Keep the present changes of throwing IOException when stream is null and >> change the throw clause of write() spec mentioning: >> "IOException - if an error occurs during writing or not able to create >> required ImageOutputStream" >> >> 2) Remove the present changes and handle null in doWrite() method by >> returning false when stream is null & add code in finally block to close the >> stream only when stream is not null. Along with this we can also change >> Returns clause of spec to mention that write() might return false when we >> are not able to create ImageOutputStream. >> >> private static boolean doWrite(RenderedImage im, ImageWriter writer, >> >> ImageOutputStream output) throws IOException { >> if (writer == null) { >> return false; >> } >> + if (output == null) { >> + return false; >> + } >> >> try { >> return doWrite(im, writer, stream); >> } finally { >> + if (stream != null) >> stream.close(); >> } >> >> Returns : >> false if no appropriate writer is found or not able to create >> required ImageOutputStream. >> >> Please let me know your inputs. >> >> Thanks, >> Jay >> >> -----Original Message----- >> From: Sergey Bylokhov >> Sent: Friday, March 18, 2016 12:24 AM >> To: Jayathirth D V >> Cc: 2d-dev@openjdk.java.net; Philip Race >> Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-8044289 : In >> ImageIO.read() and write() NPE is not handled properly for stream >> >> On 17.03.16 21:14, Jayathirth D V wrote: >>> There are many places in createImageInputStream() and >>> createImageOutputStream() where it will return null for stream. >> >> But when why you change the write/read methods? They should take null into >> account and work according to specification. If some bogus null returns from >> createImageInputStream/createImageOutputStream then it should be fixed in >> these methods. >>> >>> So for NPE described in bug to occur there can be multiple paths: >>> 1) One of the path described in bug is when >>> theRegistry.getServiceProviders() throws IAE and we return null. >> >> This is the case when we have no installed spi and should return null/false. >> >>> 2) When we pass non-existent file path to ImageIO (as described in >>> http://stackoverflow.com/questions/11153200/with-imageio-write-api-call-i-get-nullpointerexception >>> ). Here we catch FileNotFoundException but still we return stream as null >>> at the end which will cause NPE further. >> >> This is same thing described in the bug(about stream.close()). The write >> method call createImageOutputStream() and got FileNotFoundException. >> This exception should be propagated to the user, but it is replaced in the >> finally block, because we try to close the stream=null. So the fix for this >> particular case is to check the stream to null in finally, No? >> >>> 3) When we don't support the provider and theRegistry.getServiceProviders() >>> return iterator with size zero. >> >> This means that our providers do not support this case, and we should return >> null/false. >> >>> >>> For us to follow first scenario we need access to categoryMap of >>> IIORegistry and delete the ImageInputStreamSpi/ ImageOutputStreamSpi but I >>> was not able to find a way to tamper it from test case. If we follow second >>> case FileNotFoundException will be thrown by default eventhough we handle >>> NPE. >> >> But you change the code and we now contradicts the specification, in your >> case the test should expect false/null from write()/read(). >> >>> >>> In the test case we are trying to following third scenario to get stream as >>> null to verify the code changes. >> >> To catch the bogus null we should try to use another approach, or change the >> spec. But it seems all null values above are correct, we should be ready for >> them. >> >>> >>> As part of collective fix we are throwing IOException which will indicate >>> that we are not able to create required stream. >>> >>> Thanks, >>> Jay >>> >>> -----Original Message----- >>> From: Sergey Bylokhov >>> Sent: Thursday, March 17, 2016 7:27 PM >>> To: Phil Race >>> Cc: Jayathirth D V; 2d-dev@openjdk.java.net >>> Subject: Re: [OpenJDK 2D-Dev] Review Request for JDK-8044289 : In >>> ImageIO.read() and write() NPE is not handled properly for stream >>> >>> On 17.03.16 0:36, Phil Race wrote: >>>> I don't think that is the actual reason here >>> >>> But the test doing exactly this thing -> deregister all spi => in >>> this case according to specification all related >>> methods(read/write/creatImageInputStream/creatImageOutputStream) should >>> return null or false. >>> >>> - it seems likely that there >>>> was some kind of internal error or bad SPI causing this. >>>> So throwing an exception seems more appropriate. >>> >>> the problem was in some of our methods which do not expect null in some >>> places(like stream.close() from the bug description). >>> >>>> And also the bug was originally solely about write(..). >>>> >>>> -phil. >>>> >>>> >>>> On 03/16/2016 01:35 PM, Sergey Bylokhov wrote: >>>>> As far as I understand the createImageInputStream() returns null >>>>> is this stream is unsupported by current plugins via spi. Probably >>>>> the >>>>> read() method should return null too? >>>>> >>>>> /** >>>>> * Returns a {@code BufferedImage} as the result of decoding >>>>> * a supplied {@code InputStream} with an {@code ImageReader} >>>>> * chosen automatically from among those currently registered. >>>>> * The {@code InputStream} is wrapped in an >>>>> * {@code ImageInputStream}. If no registered >>>>> * {@code ImageReader} claims to be able to read the >>>>> * resulting stream, {@code null} is returned. >>>>> * >>>>> ....... >>>>> * @return a {@code BufferedImage} containing the decoded >>>>> * contents of the input, or {@code null}. >>>>> */ >>>>> public static BufferedImage read(InputStream input) throws >>>>> IOException >>>>> >>>>> >>>>> On 16.03.16 20:29, Philip Race wrote: >>>>>> The test writes out into "test.src". >>>>>> I believe that you should treat that as a "read-only" location. >>>>>> Write to a tempfile (File.createTempFile()) or TESTCLASSES. >>>>>> >>>>>> -phil. >>>>>> >>>>>> On 3/15/16, 10:50 PM, Jayathirth D V wrote: >>>>>>> >>>>>>> Hi Phil,All >>>>>>> >>>>>>> _Please review the following fix in JDK9:_ >>>>>>> >>>>>>> __ >>>>>>> >>>>>>> Bug : https://bugs.openjdk.java.net/browse/JDK-8044289 >>>>>>> >>>>>>> Webrev : http://cr.openjdk.java.net/~jdv/8044289/webrev.00/ >>>>>>> <http://cr.openjdk.java.net/%7Ejdv/8044289/webrev.00/> >>>>>>> >>>>>>> Issue : When createImageInputStream() or createImageOutputStream >>>>>>> returns null in ImageIO.read() or ImageIO.write() we are seeing >>>>>>> NPE as it stream is used further without null check. >>>>>>> >>>>>>> Root cause : "stream" is used without checking whether it is >>>>>>> null or not. >>>>>>> >>>>>>> Solution : Handle null pointer of stream and throw IIOException. >>>>>>> >>>>>>> Test case contains all possible scenarios where >>>>>>> createImageInputStream() or createImageOutputStream can return null. >>>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> Jay >>>>>>> >>>>> >>>>> >>>> >>> >>> >>> -- >>> Best regards, Sergey. >>> >> >> >> -- >> Best regards, Sergey. >> > > > -- > Best regards, Sergey. > -- Best regards, Sergey.