[rubygems/rubygems] Ignore non-tar format .gem files during search

Previously, `rake install` or `rake update` would fail if there was a non-tar format `.gem` file in the current working directory.

f562788f1d
This commit is contained in:
dearblue 2023-10-23 23:49:19 +09:00 committed by git
parent 60196b4780
commit 062d6050b0
3 changed files with 25 additions and 2 deletions

View file

@ -52,7 +52,14 @@ class Gem::Package::TarReader
return enum_for __method__ unless block_given? return enum_for __method__ unless block_given?
until @io.eof? do until @io.eof? do
header = Gem::Package::TarHeader.from @io begin
header = Gem::Package::TarHeader.from @io
rescue ArgumentError => e
# Specialize only exceptions from Gem::Package::TarHeader.strict_oct
raise e unless e.message.match?(/ is not an octal string$/)
raise Gem::Package::TarInvalidError, e.message
end
return if header.empty? return if header.empty?
entry = Gem::Package::TarReader::Entry.new header, @io entry = Gem::Package::TarReader::Entry.new header, @io
yield entry yield entry

View file

@ -40,10 +40,11 @@ class Gem::Source::Local < Gem::Source
Dir["*.gem"].each do |file| Dir["*.gem"].each do |file|
pkg = Gem::Package.new(file) pkg = Gem::Package.new(file)
spec = pkg.spec
rescue SystemCallError, Gem::Package::FormatError rescue SystemCallError, Gem::Package::FormatError
# ignore # ignore
else else
tup = pkg.spec.name_tuple tup = spec.name_tuple
@specs[tup] = [File.expand_path(file), pkg] @specs[tup] = [File.expand_path(file), pkg]
case type case type

View file

@ -25,6 +25,21 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase
io.close! io.close!
end end
def test_each_with_not_a_tar
text = "Hello, world!!?\n" * 256 # 4 KiB
io = TempIO.new text
Gem::Package::TarReader.new io do |tar|
assert_raise Gem::Package::TarInvalidError do
tar.each do
flunk "TarInvalidError was expected to occur, but an entry was found"
end
end
end
ensure
io.close!
end
def test_rewind def test_rewind
content = ("a".."z").to_a.join(" ") content = ("a".."z").to_a.join(" ")