aboutsummaryrefslogtreecommitdiffstats
path: root/test/zlib/test_zlib.rb
diff options
context:
space:
mode:
authorSorah Fukumori <sorah@cookpad.com>2023-08-11 05:12:06 +0900
committergit <svn-admin@ruby-lang.org>2023-08-10 20:12:21 +0000
commitd2864ca330f7cc7f879e737a817e1161bead65c3 (patch)
tree3dab3f7584482fff678d8cfb08a121d9ddb027c4 /test/zlib/test_zlib.rb
parentb5b34c1f84ffbc87004d4761621040e3ceb3542d (diff)
downloadruby-d2864ca330f7cc7f879e737a817e1161bead65c3.tar.gz
[ruby/zlib] Zlib.gunzip should not fail with utf-8 strings
(https://github.com/ruby/zlib/pull/55) zstream_discard_input was encoding and character-aware when given input is user-provided, so this discards `len` chars instead of `len` bytes. Also Zlib.gunzip explains in its rdoc that it is equivalent with the following code, but this doesn't fail for UTF-8 String. ```ruby string = %w[1f8b0800c28000000003cb48cdc9c9070086a6103605000000].pack("H*").force_encoding('UTF-8') sio = StringIO.new(string) p gz.read #=> "hello" gz&.close p Zlib.gunzip(string) #=> Zlib::DataError ``` Reported and discovered by eagletmt at https://twitter.com/eagletmt/status/1689692467929694209 https://github.com/ruby/zlib/commit/c5e58bc62a
Diffstat (limited to 'test/zlib/test_zlib.rb')
-rw-r--r--test/zlib/test_zlib.rb7
1 files changed, 7 insertions, 0 deletions
diff --git a/test/zlib/test_zlib.rb b/test/zlib/test_zlib.rb
index ccb8b3834e..464141f7d4 100644
--- a/test/zlib/test_zlib.rb
+++ b/test/zlib/test_zlib.rb
@@ -1457,6 +1457,13 @@ if defined? Zlib
assert_raise(Zlib::GzipFile::Error){ Zlib.gunzip(src) }
end
+ # Zlib.gunzip input is always considered a binary string, regardless of its String#encoding.
+ def test_gunzip_encoding
+ # vvvvvvvv = mtime, but valid UTF-8 string of U+0080
+ src = %w[1f8b0800c28000000003cb48cdc9c9070086a6103605000000].pack("H*").force_encoding('UTF-8')
+ assert_equal 'hello', Zlib.gunzip(src.freeze)
+ end
+
def test_gunzip_no_memory_leak
assert_no_memory_leak(%[-rzlib], "#{<<~"{#"}", "#{<<~'};'}")
d = Zlib.gzip("data")