Skip Menu |
 

This queue is for tickets about the Archive-Zip CPAN distribution.

Report information
The Basics
Id: 42585
Status: new
Priority: 0/
Queue: Archive-Zip

People
Owner: Nobody in particular
Requestors: mtr_bcard [...] russotto.net
Cc:
AdminCc:

Bug Information
Severity: Normal
Broken in: 1.26
Fixed in: (no value)



MIME-Version: 1.0
X-Mailer: MIME-tools 5.427 (Entity 5.427)
Charset: utf8
X-RT-Original-Encoding: utf-8
Content-Type: multipart/mixed; boundary="----------=_1232500366-29719-331"
Content-Length: 0
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: binary
Content-Length: 362
Download (untitled) / with headers
text/plain 362b
Archive::Zip fails to read archives with more than $Archive::Zip::ChunkSize bytes of garbage after the end of directory signature. Attached is a modified version of _findEndOfCentralDirectory which fixes this issue, by reading blocks of ChunkSize bytes backwards from the end of the zipfile, rather than reading blocks of 512 bytes back to the ChunkSize.
Subject: eocd.pl
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_1232500365-29719-330"
X-Mailer: MIME-tools 5.427 (Entity 5.427)
Charset: utf8
Content-Length: 0
Content-Type: text/plain
Content-Disposition: inline
Content-Transfer-Encoding: binary
X-RT-Original-Encoding: iso-8859-1
Content-Length: 0
Content-Type: text/x-perl-script; name="eocd.pl"
Content-Disposition: inline; filename="eocd.pl"
Content-Transfer-Encoding: binary
Content-Length: 1351
Download eocd.pl
text/x-perl 1.3k
sub _findEndOfCentralDirectory { my $self = shift; my $fh = shift; my $data = ''; $fh->seek( 0, IO::Seekable::SEEK_END ) or return _ioError("seeking to end"); my $fileLength = $fh->tell(); if ( $fileLength < END_OF_CENTRAL_DIRECTORY_LENGTH + 4 ) { return _formatError("file is too short"); } my $seekOffset = 0; my $pos = -1; my $savedBytes = ""; for ( ; ; ) { $seekOffset += $Archive::Zip::ChunkSize; $seekOffset = $fileLength if ( $seekOffset > $fileLength ); $fh->seek( -$seekOffset, IO::Seekable::SEEK_END ) or return _ioError("seek failed"); my $bytesRead = $fh->read( $data, $Archive::Zip::ChunkSize ); if ( $bytesRead != $Archive::Zip::ChunkSize ) { return _ioError("read failed"); } $data .= $savedBytes; $pos = rindex( $data, END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING ); $savedbytes= substr $data,0, (END_OF_CENTRAL_DIRECTORY_LENGTH - 1); last if ( $pos >= 0 or $seekOffset == $fileLength ); } if ( $pos >= 0 ) { $fh->seek( $pos - $Archive::Zip::ChunkSize, IO::Seekable::SEEK_CUR ) or return _ioError("seeking to EOCD"); return AZ_OK; } else { return _formatError("can't find EOCD signature"); } }


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

Please report any issues with rt.cpan.org to rt-cpan-admin@bestpractical.com.