Add `Entry#zip64?` as a better way detect Zip64 entries.

This commit is contained in:
Robert Haines 2022-02-23 10:13:13 +00:00
parent 307fc6c6e9
commit ae0262df2e
3 changed files with 9 additions and 5 deletions

View File

@ -47,7 +47,7 @@ module Zip
if ::Zip.write_zip64_support
need_zip64_eocd = cdir_offset > 0xFFFFFFFF || cdir_size > 0xFFFFFFFF \
|| @entry_set.size > 0xFFFF
need_zip64_eocd ||= @entry_set.any? { |entry| entry.extra['Zip64'] }
need_zip64_eocd ||= @entry_set.any?(&:zip64?)
if need_zip64_eocd
write_64_e_o_c_d(io, cdir_offset, cdir_size)
write_64_eocd_locator(io, eocd_offset)
@ -185,7 +185,7 @@ module Zip
entry = Entry.read_c_dir_entry(io)
next unless entry
offset = if entry.extra['Zip64']
offset = if entry.zip64?
entry.extra['Zip64'].relative_header_offset
else
entry.local_header_offset

View File

@ -154,6 +154,10 @@ module Zip
@compression_method = (@ftype == :directory ? STORED : method)
end
def zip64?
!@extra['Zip64'].nil?
end
def file_type_is?(type)
raise InternalError, "current filetype is unknown: #{inspect}" unless @ftype
@ -721,7 +725,7 @@ module Zip
# apply missing data from the zip64 extra information field, if present
# (required when file sizes exceed 2**32, but can be used for all files)
def parse_zip64_extra(for_local_header) #:nodoc:all
return if @extra['Zip64'].nil?
return unless zip64?
if for_local_header
@size, @compressed_size = @extra['Zip64'].parse(@size, @compressed_size)

View File

@ -122,13 +122,13 @@ class ZipLocalEntryTest < MiniTest::Test
buf1 = StringIO.new
entry = ::Zip::Entry.new('file.zip', 'entry_name')
entry.write_local_entry(buf1)
assert(entry.extra['Zip64'].nil?, 'zip64 extra is unnecessarily present')
refute(entry.zip64?, 'zip64 extra is unnecessarily present')
buf2 = StringIO.new
entry.size = 0x123456789ABCDEF0
entry.compressed_size = 0x0123456789ABCDEF
entry.write_local_entry(buf2, rewrite: true)
refute_nil(entry.extra['Zip64'])
assert(entry.zip64?)
refute_equal(buf1.size, 0)
assert_equal(buf1.size, buf2.size) # it can't grow, or we'd clobber file data
end