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."

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

Commit messages:
 - 8292327: java.io.EOFException in InflaterInputStream after JDK-8281962

Changes: https://git.openjdk.org/jdk/pull/9881/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9881&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8292327
  Stats: 78 lines in 3 files changed: 77 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/9881.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9881/head:pull/9881

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

Reply via email to