On Mon, 15 Aug 2022 18:34:17 GMT, Alan Bateman <al...@openjdk.org> wrote:

>> The problem is that after 
>> [JDK-8281962](https://bugs.openjdk.org/browse/JDK-8292327) we call `fill()` 
>> unconditionally (and before calling `Inflater::inflate()`) in 
>> `InflaterInputStream::read()` if `Inflater::needsInput()` is true. This 
>> misses the case where the native inflater has consumed all its input (i.e. 
>> `Inflater::needsInput()` returns true) but hasn't managed to write all the 
>> inflated data into the output buffer (e.g. because it was to small). In rare 
>> cases, there might be now more input available (i.e. calling 
>> `InflaterInputStream::fill()` will throw an `EOFException`) but we still 
>> have to call `Inflater::inflate()` to consume the buffered output from the 
>> underlying native inflater until inflation stops. 
>> 
>> The documentation of the `inflate()` method in `zlib.h` mentions this 
>> explicitely:
>> 
>>> "If `inflate()` returns `Z_OK` and with zero `avail_out`, it must be called 
>>> again after making room in the output buffer because there might be more 
>>> output pending."
>
> src/java.base/share/classes/java/util/zip/InflaterInputStream.java line 161:
> 
>> 159:                     // Even if needsInput() is true, the native 
>> inflater may have some
>> 160:                     // buffered data which couldn't fit in to the 
>> output buffer during the
>> 161:                     // last call to inflate. Consume that bffered data 
>> first before calling
> 
> bffered -> buffered

Fixed.

> src/java.base/share/classes/java/util/zip/InflaterInputStream.java line 164:
> 
>> 162:                     // fill() to avoid an EOF error if no more input is 
>> available and the
>> 163:                     // next call to inflate will finish the inflation.
>> 164:                     fill();
> 
> We need to submit a bug against fill() too as it is not currently specified 
> to throw when the input is at EOF.

Not sure about this one? `fill()` is specified to throw an `IOException` and 
`EOFException` is an `IOException`. It probably depends on how you interpret 
the current "*if an I/O error has occurred*" description in the throws section.

Do you propose to be more specific there and write something like "*if an I/O 
error has occurred or the end of the input buffer has been reached*"?

-------------

PR: https://git.openjdk.org/jdk/pull/9881

Reply via email to