From 65ca14ea6e12d2e0bf2aff60538c8ca291c65fd3 Mon Sep 17 00:00:00 2001 From: Martin Emde Date: Tue, 31 Jan 2023 16:12:28 -0800 Subject: [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 --- lib/rubygems/package/tar_reader/entry.rb | 10 ++++++---- 1 file 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) -- cgit v1.2.3