Bug #5929
closedZlib::Inflate#set_dictionary does not work with short input
Description
=begin
If a deflate stream requires a dictionary and the block of data is short it is impossible to decompress the data without modifying the returned bytes. Upon receiving a Zlib::NeedDict exception the documentation for Zlib::Inflate#inflate states:
Set the dictionary by Zlib::Inflate#set_dictionary and then
call this method again with an empty string
Calling inflate with an empty string does not decompress any further bytes due to (({do_inflate()})) ignoring zero-byte strings to avoid a Z_BUF_ERROR.
The attached patch alters the (({do_inflate()})) to inflate more data when either more data was provided by the user or (({z->stream.avail_in})) is nonzero.
Reading (({zstream_run()})) it appears that (({z->stream.avail_in})) will be set to zero upon consuming a chunk of data, so providing an empty string in the middle of a non-dictionary stream will be OK, but please check it.
=end
Files