Bug #5929

Zlib::Inflate#set_dictionary does not work with short input

Added by Eric Hodel over 3 years ago. Updated about 3 years ago.

[ruby-core:42231]
Status:Closed
Priority:Normal
Assignee:-
ruby -v:ruby 2.0.0dev (2012-01-26 trunk 34377) [x86_64-darwin11.2.0] Backport:

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

zlib.c.set_dictionary.patch Magnifier (2.13 KB) Eric Hodel, 01/26/2012 11:59 AM


Related issues

Related to Ruby trunk - Feature #5937: Zlib::Inflate#add_dictionary to pre-supply dictionaries for inflate streams Closed 01/27/2012

Associated revisions

Revision 34552
Added by Eric Hodel about 3 years ago

  • ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data exists. Allows Zlib::Inflate#set_dictionary to work. [ruby-trunk - Bug #5929]

Revision 34552
Added by Eric Hodel about 3 years ago

  • ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data exists. Allows Zlib::Inflate#set_dictionary to work. [ruby-trunk - Bug #5929]

History

#1 Updated by Eric Hodel about 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r34552.
Eric, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • ext/zlib/zlib.c (do_inflate): Inflate more data if buffered data exists. Allows Zlib::Inflate#set_dictionary to work. [ruby-trunk - Bug #5929]

Also available in: Atom PDF