Unexpected EOFException in ImageReaderSpi.canDecodeInput

Philip Race philip.race at oracle.com
Fri May 20 18:00:30 UTC 2022


OK .. we can probably take the proposed change, but there's no guarantee 
it won't
still happen with 3rd party external plugins.

I've filed the bug for you : 
https://bugs.openjdk.java.net/browse/JDK-8287102

-phil.

On 5/18/22 2:47 AM, Martin Desruisseaux wrote:
> Hello Philip
>
> Le 17/05/2022 à 20:36, Philip Race a écrit :
>
>> Why is it unexpected ?
>>
> The purpose of ImageReaderSpi.canDecodeInput(Object) is to tell if the 
> source object seems to be supported by the reader. If the file is too 
> small, it is not supported by the reader. So a return value of false 
> is what I would expect from the method contract, because the method is 
> capable to provide a clear answer to the question "does it seems a 
> valid file?"
>
> By contrast, I would expect IOException to be thrown only if an 
> unexpected error prevents canDecodeInput(Object) from fulfilling its 
> method contract, e.g. a lost of internet connection prevents the 
> reader to check the magic number. EOFException does not met that 
> criterion for the reason stated above.
>
>
>> The method declares that it throws IOException .. which if thrown 
>> clearly means the stream can't be de-coded.
>>
> In my understanding of the method contract, if the stream can not be 
> decoded, this is indicated by a return value of false rather than an 
> IOException. In the context of ImageReaderSpi.canDecodeInput(Object), 
> I interpret IOException as an error that prevent the method from 
> answering the question "does it seems a valid file?"
>
>
>> But this fix is still putting it on each plugin to behave itself .. 
>> and we already handle that in the ImageIO class
>> although I think it isn't perfect, as it still relies on co-operation 
>> with regard to mark()
>>
>> And if you call this directly, you can handle that just as well 
>> yourself .. and still can't trust extra
>> plugins to behave ..,. so what is the use case for this fix ? 
>
> In my case I handle the search of ImageReader myself. Contrarily to 
> ImageIO I do not catch IOException, because it may be a serious error 
> that prevent the plugin from answering its question. The stream may 
> now be in a corrupted state (it is not always a local file; it can be 
> on the cloud, a database BLOB, etc), and continuing with other readers 
> after the initial error can cause a series of confusing error 
> messages. Instead I let the first IOException propagates. The meaning 
> is very different than "unsupported format".
>
> I could catch the specific case of EOFException, but I don't because 
> 1) it relies on assumptions about how the plugin behave, 2) the input 
> may be an object other than ImageInputStream that we don't know how to 
> mark, and 3) EOFException can in some circumstances be a serious error 
> (i.e. EOFException occurring not in the stream given to the 
> canDecodeInput(Object) method, but is some auxiliary file that the 
> plugin needs to read). Only the plugin knows for sure if EOFException 
> means "unsupported format" or "serious error".
>
>     Regards,
>
>         Martin
>
>




More information about the client-libs-dev mailing list