diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-28 20:36:21 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-28 20:36:21 +0000 |
commit | 9f2f1fcbc8fc896e234a1b2939ba660ec56b55f2 (patch) | |
tree | 9c95760326ed3f1b27da4a86ae5229e9bb5cb91f | |
parent | c94b0e8568fb608ad0890fa9e3bf26997e6a6b50 (diff) | |
download | ruby-9f2f1fcbc8fc896e234a1b2939ba660ec56b55f2.tar.gz |
* ext/zlib/zlib.c (zstream_run): Fix handling of deflate streams that
need a dictionary but are being decompressed by Zlib::Inflate.inflate
(which has no option to set a dictionary). Now Zlib::NeedDict is
raised instead of crashing. [ruby-trunk - Bug #8829]
* test/zlib/test_zlib.rb (TestZlibInflate): Test for the above.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ext/zlib/zlib.c | 12 | ||||
-rw-r--r-- | test/zlib/test_zlib.rb | 6 |
3 files changed, 21 insertions, 5 deletions
@@ -1,3 +1,11 @@ +Thu Aug 29 05:35:58 2013 Eric Hodel <drbrain@segment7.net> + + * ext/zlib/zlib.c (zstream_run): Fix handling of deflate streams that + need a dictionary but are being decompressed by Zlib::Inflate.inflate + (which has no option to set a dictionary). Now Zlib::NeedDict is + raised instead of crashing. [ruby-trunk - Bug #8829] + * test/zlib/test_zlib.rb (TestZlibInflate): Test for the above. + Thu Aug 29 02:40:45 2013 Aaron Patterson <aaron@tenderlovemaking.com> * ext/psych/lib/psych/scalar_scanner.rb: invalid floats should be diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 918bad6b7d..df2a2501b2 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -1074,11 +1074,13 @@ loop: } if (err == Z_NEED_DICT) { VALUE self = (VALUE)z->stream.opaque; - VALUE dicts = rb_ivar_get(self, id_dictionaries); - VALUE dict = rb_hash_aref(dicts, rb_uint2inum(z->stream.adler)); - if (!NIL_P(dict)) { - rb_inflate_set_dictionary(self, dict); - goto loop; + if (self) { + VALUE dicts = rb_ivar_get(self, id_dictionaries); + VALUE dict = rb_hash_aref(dicts, rb_uint2inum(z->stream.adler)); + if (!NIL_P(dict)) { + rb_inflate_set_dictionary(self, dict); + goto loop; + } } } raise_zlib_error(err, z->stream.msg); diff --git a/test/zlib/test_zlib.rb b/test/zlib/test_zlib.rb index 81d440f846..3122e7769e 100644 --- a/test/zlib/test_zlib.rb +++ b/test/zlib/test_zlib.rb @@ -232,6 +232,12 @@ if defined? Zlib end class TestZlibInflate < Test::Unit::TestCase + def test_class_inflate_dictionary + assert_raises(Zlib::NeedDict) do + Zlib::Inflate.inflate([0x08,0x3C,0x0,0x0,0x0,0x0].pack("c*")) + end + end + def test_initialize assert_raise(Zlib::StreamError) { Zlib::Inflate.new(-1) } |