Skip to content

Commit be65c98

Browse files
Merge pull request #9 from genkgo/use_gmp_for_cdr_len_ofs
use gmp for cdr_len and cdr_ofs
2 parents 8f2bd53 + 60930fc commit be65c98

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/ZipReader.php

+10-8
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ final class ZipReader implements ArchiveReader
4242
private $files = [];
4343

4444
/**
45-
* @var int
45+
* @var \GMP
4646
*/
47-
private $cdr_ofs = 0;
47+
private $cdr_ofs;
4848

4949
/**
50-
* @var int
50+
* @var \GMP
5151
*/
5252
private $cdr_len;
5353

@@ -57,6 +57,8 @@ final class ZipReader implements ArchiveReader
5757
public function __construct(Archive $archive)
5858
{
5959
$this->archive = $archive;
60+
$this->cdr_ofs = \gmp_init(0);
61+
$this->cdr_len = \gmp_init(0);
6062
}
6163

6264
/**
@@ -272,7 +274,7 @@ private function completeResourceStream(): \SplTempFileObject
272274
private function addToCdr(string $name, int $method, int $crc, string $zlen, string $len, int $rec_len, int $genb = 0, int $fattr = 0x20)
273275
{
274276
$this->files[] = [$name, $method, $crc, $zlen, $len, $this->cdr_ofs, $genb, $fattr];
275-
$this->cdr_ofs += $rec_len;
277+
$this->cdr_ofs = \gmp_add($this->cdr_ofs, $rec_len);
276278
}
277279

278280
/**
@@ -342,7 +344,7 @@ private function addCdrFile(array $args): \SplTempFileObject
342344
// pack fields, then append name and comment
343345
$ret = PackHelper::packFields($fields) . $name . $extra . $comment;
344346

345-
$this->cdr_len += \strlen($ret);
347+
$this->cdr_len = \gmp_add($this->cdr_len, \strlen($ret));
346348

347349
$stream = new \SplTempFileObject();
348350
$stream->fwrite($ret);
@@ -395,7 +397,7 @@ private function addCdrEofZip64(): \SplTempFileObject
395397
*/
396398
private function addCdrEofLocatorZip64(): \SplTempFileObject
397399
{
398-
list($cdr_ofs_low, $cdr_ofs_high) = PackHelper::int64Split($this->cdr_len + $this->cdr_ofs);
400+
list($cdr_ofs_low, $cdr_ofs_high) = PackHelper::int64Split(\gmp_add($this->cdr_len, $this->cdr_ofs));
399401

400402
$fields = [ // (from V,F of APPNOTE.TXT)
401403
['V', 0x07064b50], // zip64 end of central dir locator signature
@@ -454,7 +456,7 @@ private function addCdrEof(): \SplTempFileObject
454456
private function clear(): void
455457
{
456458
$this->files = [];
457-
$this->cdr_ofs = 0;
458-
$this->cdr_len = 0;
459+
$this->cdr_ofs = \gmp_init(0);
460+
$this->cdr_len = \gmp_init(0);
459461
}
460462
}

0 commit comments

Comments
 (0)