Skip to content

Commit

Permalink
Merge pull request #72 from martinemde/martinemde/readpartial-fix
Browse files Browse the repository at this point in the history
In Zlib::GzipReader#eof? check if we're actually at eof
  • Loading branch information
nobu authored Feb 22, 2024
2 parents a8fe482 + 437bea8 commit 78658aa
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
3 changes: 3 additions & 0 deletions ext/zlib/zlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -3500,6 +3500,9 @@ static VALUE
rb_gzfile_eof_p(VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
while (!ZSTREAM_IS_FINISHED(&gz->z) && ZSTREAM_BUF_FILLED(&gz->z) == 0) {
gzfile_read_more(gz, Qnil);
}
return GZFILE_IS_FINISHED(gz) ? Qtrue : Qfalse;
}

Expand Down
32 changes: 32 additions & 0 deletions test/zlib/test_zlib.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,38 @@ def test_double_close
}
end

# Various methods of Zlib::GzipReader failed when to reading files
# just a few bytes larger than GZFILE_READ_SIZE.
def test_gzfile_read_size_boundary
Tempfile.create("test_zlib_gzip_read_size_boundary") {|t|
t.close
# NO_COMPRESSION helps with recreating the error condition.
# The error happens on compressed files too, but it's harder to reproduce.
# For example, ~12750 bytes are needed to trigger the error using __FILE__.
# We avoid this because the test file will change over time.
Zlib::GzipWriter.open(t.path, Zlib::NO_COMPRESSION) do |gz|
gz.print("\n" * 2024) # range from 2024 to 2033 triggers the error
gz.flush
end

Zlib::GzipReader.open(t.path) do |f|
f.readpartial(1024) until f.eof?
assert_raise(EOFError) { f.readpartial(1) }
end

Zlib::GzipReader.open(t.path) do |f|
f.readline until f.eof?
assert_raise(EOFError) { f.readline }
end

Zlib::GzipReader.open(t.path) do |f|
b = f.readbyte until f.eof?
f.ungetbyte(b)
f.readbyte
assert_raise(EOFError) { f.readbyte }
end
}
end
end

class TestZlibGzipWriter < Test::Unit::TestCase
Expand Down

0 comments on commit 78658aa

Please sign in to comment.