On 2026-08-06T10:36:59, Aristo Chen <[email protected]> wrote:
> gunzip: Fix spurious Z_BUF_ERROR in chunked gzwrite decompression
>
> The chunked decompression loop in gzwrite() treats any inflate()
> return value other than Z_OK and Z_STREAM_END as a fatal error. When
> the current input chunk happens to be exhausted at exactly the same
> time as the write buffer fills up, the inner loop calls inflate()
> again with avail_in == 0. No forward progress is possible in that
> state, so inflate() returns Z_BUF_ERROR and gzwrite() bails out:
>
>   Error: inflate() returned -5
>
> Per the zlib documentation, Z_BUF_ERROR is not fatal and only means
> that no progress was possible; the call should be repeated once more
> input is available. The reference implementation in zlib
> examples/zpipe.c continues in this exact situation.
>
> The failure is data dependent: it needs a stream position where the
> consumed input and produced output line up with both the chunk and
> the write buffer boundary at once, and the inflate side must have no
> buffered output. That is most likely with incompressible input, where
> deflate emits stored blocks and inflate holds no lookahead bits. This
> is how dm_test_cmd_zip_gzwrite occasionally fails in sandbox64 CI on
> random data with gzwrite_chunk = SZ_1M + 1, stopping at a multiple of
> the 1 MiB write buffer:
>
>   12582912/16777216
>   Error: inflate() returned -5
>
> Detect this case and let the outer loop refill the input chunk
> instead of failing.
>
> On sandbox64, the random data dm_test_cmd_zip_gzwrite test failed
> 17 out of 2000 runs (about 1 percent) without this fix, every time
> with the same signature as the CI flake, and passed 2000 out of 2000
> runs with it.
>
> Fixes: 58e523fedf48 ("gunzip: Implement chunked decompression")
> Signed-off-by: Aristo Chen <[email protected]>
>
> lib/gunzip.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)

Reviewed-by: Simon Glass <[email protected]>

Reply via email to