mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
zlib (gzfile_write_raw): do not resize string after .write call
Apparently, a component of Rails implements a buffering .write method which keeps the String buffer around and makes it unsafe for us to clear it after calling .write. This caused Rack::Deflater to give empty results when enabled. Fortunately, per r61631 /a55abcc0ca
, this misguided optimization was only worth a small (0.5MB) savings and we still benefit from the majority of the memory savings in that change. Thanks to zunda for the bug report. [ruby-core:90133] [Bug #15356] Fixes: r61631 (commita55abcc0ca
) ("zlib: reduce garbage on gzip writes (deflate)") git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66268 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7780553c30
commit
cc9b57a2b4
2 changed files with 17 additions and 1 deletions
|
@ -2364,7 +2364,6 @@ gzfile_write_raw(struct gzfile *gz)
|
|||
str = zstream_detach_buffer(&gz->z);
|
||||
OBJ_TAINT(str); /* for safe */
|
||||
rb_funcall(gz->io, id_write, 1, str);
|
||||
rb_str_resize(str, 0);
|
||||
if ((gz->z.flags & GZFILE_FLAG_SYNC)
|
||||
&& rb_respond_to(gz->io, id_flush))
|
||||
rb_funcall(gz->io, id_flush, 0);
|
||||
|
|
|
@ -1081,6 +1081,23 @@ if defined? Zlib
|
|||
assert_nothing_raised { w.close }
|
||||
}
|
||||
end
|
||||
|
||||
def test_zlib_writer_buffered_write
|
||||
bug15356 = '[ruby-core:90346] [Bug #15356]'.freeze
|
||||
fixes = 'r61631 (commit a55abcc0ca6f628fc05304f81e5a044d65ab4a68)'.freeze
|
||||
ary = []
|
||||
def ary.write(*args)
|
||||
self.concat(args)
|
||||
end
|
||||
gz = Zlib::GzipWriter.new(ary)
|
||||
gz.write(bug15356)
|
||||
gz.write("\n")
|
||||
gz.write(fixes)
|
||||
gz.close
|
||||
assert_not_predicate ary, :empty?
|
||||
exp = [ bug15356, fixes ]
|
||||
assert_equal exp, Zlib.gunzip(ary.join('')).split("\n")
|
||||
end
|
||||
end
|
||||
|
||||
class TestZlib < Test::Unit::TestCase
|
||||
|
|
Loading…
Reference in a new issue