diff options
author | Martin Emde <[email protected]> | 2023-01-31 16:12:28 -0800 |
---|---|---|
committer | git <[email protected]> | 2023-02-02 17:17:34 +0000 |
commit | 65ca14ea6e12d2e0bf2aff60538c8ca291c65fd3 (patch) | |
tree | db32d7f4c8d8862d7ececd6d63c43b289f1e7456 /lib/rubygems/package | |
parent | 0853703ec6484332ef0183ebd459a8c715d36a43 (diff) |
[rubygems/rubygems] Fix TarReader::Entry#read/partial to match File#read and StringIO#read
TarReader is used as an IO object, but doesn't behave the same as other
implementations. These fixes make `read` and `readpartial` conform to the
interface of StringIO and File.
https://github.com/rubygems/rubygems/commit/bba32d7217
Diffstat (limited to 'lib/rubygems/package')
-rw-r--r-- | lib/rubygems/package/tar_reader/entry.rb | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/rubygems/package/tar_reader/entry.rb b/lib/rubygems/package/tar_reader/entry.rb index 8634381c18..e7b0cd0602 100644 --- a/lib/rubygems/package/tar_reader/entry.rb +++ b/lib/rubygems/package/tar_reader/entry.rb @@ -130,9 +130,10 @@ class Gem::Package::TarReader::Entry def read(len = nil) check_closed - return nil if @read >= @header.size - len ||= @header.size - @read + + return nil if len > 0 && @read >= @header.size + max_read = [len, @header.size - @read].min ret = @io.read max_read @@ -144,9 +145,10 @@ class Gem::Package::TarReader::Entry def readpartial(maxlen = nil, outbuf = "".b) check_closed - raise EOFError if @read >= @header.size - maxlen ||= @header.size - @read + + raise EOFError if maxlen > 0 && @read >= @header.size + max_read = [maxlen, @header.size - @read].min @io.readpartial(max_read, outbuf) |