1
0
mirror of https://github.com/Ne-Lexa/php-zip.git synced 2025-07-18 06:31:13 +02:00

Fix #24 Change fread for variable size reads

This commit is contained in:
wapplay
2018-10-21 01:32:01 +03:00
parent c163f0583e
commit d8bb1be43b

View File

@@ -144,8 +144,14 @@ class ZipInputStream implements ZipInputStreamInterface
); );
} }
// .ZIP file comment (variable size) // .ZIP file comment (variable size)
if (0 < $data['commentLength']) { if ($data['commentLength'] > 0) {
$comment = fread($this->in, $data['commentLength']); $comment = '';
$offset = 0;
while ($offset < $data['commentLength']) {
$read = min(8192 /* chunk size */, $data['commentLength'] - $offset);
$comment .= fread($this->in, $read);
$offset += $read;
}
} }
$this->preamble = $endOfCentralDirRecordPos; $this->preamble = $endOfCentralDirRecordPos;
$this->postamble = $size - ftell($this->in); $this->postamble = $size - ftell($this->in);
@@ -314,7 +320,13 @@ class ZipInputStream implements ZipInputStreamInterface
// $utf8 = ($data['gpbf'] & ZipEntry::GPBF_UTF8) !== 0; // $utf8 = ($data['gpbf'] & ZipEntry::GPBF_UTF8) !== 0;
// See appendix D of PKWARE's ZIP File Format Specification. // See appendix D of PKWARE's ZIP File Format Specification.
$name = fread($this->in, $data['fileLength']); $name = '';
$offset = 0;
while ($offset < $data['fileLength']) {
$read = min(8192 /* chunk size */, $data['fileLength'] - $offset);
$name .= fread($this->in, $read);
$offset += $read;
}
$entry = new ZipSourceEntry($this); $entry = new ZipSourceEntry($this);
$entry->setName($name); $entry->setName($name);
@@ -329,10 +341,24 @@ class ZipInputStream implements ZipInputStreamInterface
$entry->setExternalAttributes($data['rawExternalAttributes']); $entry->setExternalAttributes($data['rawExternalAttributes']);
$entry->setOffset($data['lfhOff']); // must be unmapped! $entry->setOffset($data['lfhOff']); // must be unmapped!
if ($data['extraLength'] > 0) { if ($data['extraLength'] > 0) {
$entry->setExtra(fread($this->in, $data['extraLength'])); $extra = '';
$offset = 0;
while ($offset < $data['extraLength']) {
$read = min(8192 /* chunk size */, $data['extraLength'] - $offset);
$extra .= fread($this->in, $read);
$offset += $read;
}
$entry->setExtra($extra);
} }
if ($data['commentLength'] > 0) { if ($data['commentLength'] > 0) {
$entry->setComment(fread($this->in, $data['commentLength'])); $comment = '';
$offset = 0;
while ($offset < $data['commentLength']) {
$read = min(8192 /* chunk size */, $data['commentLength'] - $offset);
$comment .= fread($this->in, $read);
$offset += $read;
}
$entry->setComment($comment);
} }
return $entry; return $entry;
} }
@@ -382,10 +408,14 @@ class ZipInputStream implements ZipInputStreamInterface
// Get raw entry content // Get raw entry content
$compressedSize = $entry->getCompressedSize(); $compressedSize = $entry->getCompressedSize();
$compressedSize = PHP_INT_SIZE === 4 ? sprintf('%u', $compressedSize) : $compressedSize; $compressedSize = PHP_INT_SIZE === 4 ? sprintf('%u', $compressedSize) : $compressedSize;
if ($compressedSize > 0) {
$content = fread($this->in, $compressedSize);
} else {
$content = ''; $content = '';
if ($compressedSize > 0) {
$offset = 0;
while ($offset < $compressedSize) {
$read = min(8192 /* chunk size */, $compressedSize - $offset);
$content .= fread($this->in, $read);
$offset += $read;
}
} }
$skipCheckCrc = false; $skipCheckCrc = false;
@@ -498,7 +528,13 @@ class ZipInputStream implements ZipInputStreamInterface
if ($sourceExtraLength > 0) { if ($sourceExtraLength > 0) {
// read Local File Header extra fields // read Local File Header extra fields
fseek($this->in, $pos + ZipEntry::LOCAL_FILE_HEADER_MIN_LEN + $nameLength, SEEK_SET); fseek($this->in, $pos + ZipEntry::LOCAL_FILE_HEADER_MIN_LEN + $nameLength, SEEK_SET);
$extra = fread($this->in, $sourceExtraLength); $extra = '';
$offset = 0;
while ($offset < $sourceExtraLength) {
$read = min(8192 /* chunk size */, $sourceExtraLength - $offset);
$extra .= fread($this->in, $read);
$offset += $read;
}
$extraFieldsCollection = ExtraFieldsFactory::createExtraFieldCollections($extra, $entry); $extraFieldsCollection = ExtraFieldsFactory::createExtraFieldCollections($extra, $entry);
if (isset($extraFieldsCollection[ApkAlignmentExtraField::getHeaderId()]) && $this->zipModel->isZipAlign()) { if (isset($extraFieldsCollection[ApkAlignmentExtraField::getHeaderId()]) && $this->zipModel->isZipAlign()) {
unset($extraFieldsCollection[ApkAlignmentExtraField::getHeaderId()]); unset($extraFieldsCollection[ApkAlignmentExtraField::getHeaderId()]);