From 00dd097b2d45e26392f4450bee4f02b200279722 Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Tue, 23 Feb 2021 19:44:48 +0300 Subject: [PATCH] added static analysis --- .github/workflows/build.yml | 12 ++++++++---- src/IO/Stream/ResponseStream.php | 14 ++++++++------ src/IO/ZipReader.php | 10 +++++----- src/Model/Data/ZipFileData.php | 9 +++------ .../Extra/Fields/AbstractUnicodeExtraField.php | 8 ++++---- .../Extra/Fields/ApkAlignmentExtraField.php | 16 +++++----------- src/Model/Extra/Fields/AsiExtraField.php | 14 +++++++------- .../Extra/Fields/ExtendedTimestampExtraField.php | 10 +++++----- src/Model/Extra/Fields/JarMarkerExtraField.php | 10 +++++----- src/Model/Extra/Fields/NewUnixExtraField.php | 10 +++++----- src/Model/Extra/Fields/NtfsExtraField.php | 12 ++++++------ src/Model/Extra/Fields/OldUnixExtraField.php | 10 +++++----- .../Extra/Fields/UnicodeCommentExtraField.php | 2 +- src/Model/Extra/Fields/UnicodePathExtraField.php | 2 +- .../Extra/Fields/UnrecognizedExtraField.php | 2 +- src/Model/Extra/Fields/WinZipAesExtraField.php | 2 +- src/Model/Extra/Fields/Zip64ExtraField.php | 2 +- src/Model/Extra/ZipExtraField.php | 8 ++++---- src/Model/ZipEntry.php | 9 +++------ .../IgnoreFilesRecursiveFilterIterator.php | 3 ++- src/ZipFile.php | 5 ++++- 21 files changed, 84 insertions(+), 86 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 354c55a..abb3ce8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,7 +54,7 @@ jobs: extensions: ${{ env.extensions }} coverage: pcov ini-values: ${{ env.PHP_INI }} - tools: composer:v2 + tools: composer:v2, cs2pr - name: Determine composer cache directory on Linux or MacOS @@ -109,9 +109,13 @@ jobs: if: env.PHPUNIT_COVERAGE == 1 run: vendor/bin/phpunit -v --coverage-clover=coverage.clover + - + name: Static analysis + run: vendor/bin/psalm --shepherd --stats --output-format=checkstyle | cs2pr --graceful-warnings --colorize + - name: Upload code coverage scrutinizer if: env.PHPUNIT_COVERAGE == 1 - run: | - wget https://scrutinizer-ci.com/ocular.phar - php ocular.phar code-coverage:upload --format=php-clover coverage.clover + run: | + wget https://scrutinizer-ci.com/ocular.phar + php ocular.phar code-coverage:upload --format=php-clover coverage.clover diff --git a/src/IO/Stream/ResponseStream.php b/src/IO/Stream/ResponseStream.php index 9d5de7d..1d61dd8 100644 --- a/src/IO/Stream/ResponseStream.php +++ b/src/IO/Stream/ResponseStream.php @@ -59,7 +59,7 @@ class ResponseStream implements StreamInterface ], ]; - /** @var resource */ + /** @var resource|null */ private $stream; private ?int $size = null; @@ -97,7 +97,7 @@ class ResponseStream implements StreamInterface */ public function getMetadata($key = null) { - if (!$this->stream) { + if ($this->stream === null) { return $key ? null : []; } $meta = stream_get_meta_data($this->stream); @@ -141,7 +141,7 @@ class ResponseStream implements StreamInterface */ public function rewind(): void { - $this->seekable && rewind($this->stream); + $this->stream !== null && $this->seekable && rewind($this->stream); } /** @@ -199,7 +199,7 @@ class ResponseStream implements StreamInterface */ public function seek($offset, $whence = \SEEK_SET): void { - $this->seekable && fseek($this->stream, $offset, $whence); + $this->stream !== null && $this->seekable && fseek($this->stream, $offset, $whence); } /** @@ -217,7 +217,7 @@ class ResponseStream implements StreamInterface { $this->size = null; - return $this->writable ? fwrite($this->stream, $string) : false; + return $this->stream !== null && $this->writable ? fwrite($this->stream, $string) : false; } /** @@ -233,7 +233,7 @@ class ResponseStream implements StreamInterface */ public function read($length): string { - return $this->readable ? fread($this->stream, $length) : ''; + return $this->stream !== null && $this->readable ? fread($this->stream, $length) : ''; } /** @@ -257,6 +257,8 @@ class ResponseStream implements StreamInterface /** * Closes the stream and any underlying resources. + * + * @psalm-suppress InvalidPropertyAssignmentValue */ public function close(): void { diff --git a/src/IO/ZipReader.php b/src/IO/ZipReader.php index 8518b16..d8aea9b 100644 --- a/src/IO/ZipReader.php +++ b/src/IO/ZipReader.php @@ -370,13 +370,10 @@ class ZipReader if ($unicodePathExtraField !== null && $unicodePathExtraField->getCrc32() === crc32($entryName)) { $unicodePath = $unicodePathExtraField->getUnicodeValue(); - if ($unicodePath !== null) { + if ($unicodePath !== '') { $unicodePath = str_replace('\\', '/', $unicodePath); - if ( - $unicodePath !== '' - && substr_count($entryName, '/') === substr_count($unicodePath, '/') - ) { + if (substr_count($entryName, '/') === substr_count($unicodePath, '/')) { $entryName = $unicodePath; } } @@ -869,6 +866,9 @@ class ZipReader return \PHP_INT_SIZE === 8; // true for 64bit system } + /** + * @psalm-suppress InvalidPropertyAssignmentValue + */ public function close(): void { if (\is_resource($this->inStream)) { diff --git a/src/Model/Data/ZipFileData.php b/src/Model/Data/ZipFileData.php index aba3451..23bd62b 100644 --- a/src/Model/Data/ZipFileData.php +++ b/src/Model/Data/ZipFileData.php @@ -71,11 +71,8 @@ class ZipFileData implements ZipData */ public function copyDataToStream($outStream): void { - try { - $stream = $this->getDataAsStream(); - stream_copy_to_stream($stream, $outStream); - } finally { - fclose($stream); - } + $stream = $this->getDataAsStream(); + stream_copy_to_stream($stream, $outStream); + fclose($stream); } } diff --git a/src/Model/Extra/Fields/AbstractUnicodeExtraField.php b/src/Model/Extra/Fields/AbstractUnicodeExtraField.php index df19c20..a56e112 100644 --- a/src/Model/Extra/Fields/AbstractUnicodeExtraField.php +++ b/src/Model/Extra/Fields/AbstractUnicodeExtraField.php @@ -62,8 +62,8 @@ abstract class AbstractUnicodeExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException on error * @@ -92,8 +92,8 @@ abstract class AbstractUnicodeExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException on error * diff --git a/src/Model/Extra/Fields/ApkAlignmentExtraField.php b/src/Model/Extra/Fields/ApkAlignmentExtraField.php index cc2f780..a96f20e 100644 --- a/src/Model/Extra/Fields/ApkAlignmentExtraField.php +++ b/src/Model/Extra/Fields/ApkAlignmentExtraField.php @@ -21,7 +21,7 @@ use PhpZip\Model\ZipEntry; * @see https://android.googlesource.com/platform/tools/apksig/+/master/src/main/java/com/android/apksig/ApkSigner.java * @see https://developer.android.com/studio/command-line/zipalign */ -class ApkAlignmentExtraField implements ZipExtraField +final class ApkAlignmentExtraField implements ZipExtraField { /** * @var int Extensible data block/field header ID used for storing @@ -31,12 +31,6 @@ class ApkAlignmentExtraField implements ZipExtraField */ public const HEADER_ID = 0xd935; - /** - * @var int minimum size (in bytes) of the extensible data block/field used - * for alignment of uncompressed entries - */ - public const MIN_SIZE = 6; - /** @var int */ public const ALIGNMENT_BYTES = 4; @@ -86,8 +80,8 @@ class ApkAlignmentExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * @@ -116,8 +110,8 @@ class ApkAlignmentExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException on error * diff --git a/src/Model/Extra/Fields/AsiExtraField.php b/src/Model/Extra/Fields/AsiExtraField.php index 76d8735..6575e6b 100644 --- a/src/Model/Extra/Fields/AsiExtraField.php +++ b/src/Model/Extra/Fields/AsiExtraField.php @@ -53,7 +53,7 @@ use PhpZip\Model\ZipEntry; * * @see ftp://ftp.info-zip.org/pub/infozip/doc/appnote-iz-latest.zip Info-ZIP version Specification */ -class AsiExtraField implements ZipExtraField +final class AsiExtraField implements ZipExtraField { /** @var int Header id */ public const HEADER_ID = 0x756e; @@ -99,12 +99,12 @@ class AsiExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws Crc32Exception * - * @return static + * @return AsiExtraField */ public static function unpackLocalFileData(string $buffer, ?ZipEntry $entry = null): self { @@ -134,8 +134,8 @@ class AsiExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws Crc32Exception * @@ -216,7 +216,7 @@ class AsiExtraField implements ZipExtraField * * @return int the type with the mode */ - protected function getPermissionsMode(int $mode): int + private function getPermissionsMode(int $mode): int { $type = 0; diff --git a/src/Model/Extra/Fields/ExtendedTimestampExtraField.php b/src/Model/Extra/Fields/ExtendedTimestampExtraField.php index 339e2a1..c676da8 100644 --- a/src/Model/Extra/Fields/ExtendedTimestampExtraField.php +++ b/src/Model/Extra/Fields/ExtendedTimestampExtraField.php @@ -73,7 +73,7 @@ use PhpZip\Model\ZipEntry; * * @see ftp://ftp.info-zip.org/pub/infozip/doc/appnote-iz-latest.zip Info-ZIP version Specification */ -class ExtendedTimestampExtraField implements ZipExtraField +final class ExtendedTimestampExtraField implements ZipExtraField { /** @var int Header id */ public const HEADER_ID = 0x5455; @@ -158,8 +158,8 @@ class ExtendedTimestampExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return ExtendedTimestampExtraField */ @@ -195,8 +195,8 @@ class ExtendedTimestampExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return ExtendedTimestampExtraField */ diff --git a/src/Model/Extra/Fields/JarMarkerExtraField.php b/src/Model/Extra/Fields/JarMarkerExtraField.php index 601a79d..3d06977 100644 --- a/src/Model/Extra/Fields/JarMarkerExtraField.php +++ b/src/Model/Extra/Fields/JarMarkerExtraField.php @@ -24,7 +24,7 @@ use PhpZip\Model\ZipEntry; * If this extra field is added as the very first extra field of * the archive, Solaris will consider it an executable jar file. */ -class JarMarkerExtraField implements ZipExtraField +final class JarMarkerExtraField implements ZipExtraField { /** @var int Header id. */ public const HEADER_ID = 0xCAFE; @@ -79,8 +79,8 @@ class JarMarkerExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException on error * @@ -98,8 +98,8 @@ class JarMarkerExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException on error * diff --git a/src/Model/Extra/Fields/NewUnixExtraField.php b/src/Model/Extra/Fields/NewUnixExtraField.php index f42bdeb..66e74ee 100644 --- a/src/Model/Extra/Fields/NewUnixExtraField.php +++ b/src/Model/Extra/Fields/NewUnixExtraField.php @@ -51,7 +51,7 @@ use PhpZip\Model\ZipEntry; * and this extra field are present, the values in this extra field * supercede the values in that extra field. */ -class NewUnixExtraField implements ZipExtraField +final class NewUnixExtraField implements ZipExtraField { /** @var int header id */ public const HEADER_ID = 0x7875; @@ -88,8 +88,8 @@ class NewUnixExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * @@ -120,8 +120,8 @@ class NewUnixExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * diff --git a/src/Model/Extra/Fields/NtfsExtraField.php b/src/Model/Extra/Fields/NtfsExtraField.php index fa185ce..a1f5fcf 100644 --- a/src/Model/Extra/Fields/NtfsExtraField.php +++ b/src/Model/Extra/Fields/NtfsExtraField.php @@ -19,9 +19,9 @@ use PhpZip\Model\ZipEntry; /** * NTFS Extra Field. * - * @see https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT .ZIP File Format Specification + * @see https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT .ZIP File Format Specification */ -class NtfsExtraField implements ZipExtraField +final class NtfsExtraField implements ZipExtraField { /** @var int Header id */ public const HEADER_ID = 0x000a; @@ -84,8 +84,8 @@ class NtfsExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * @@ -127,8 +127,8 @@ class NtfsExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @throws ZipException * diff --git a/src/Model/Extra/Fields/OldUnixExtraField.php b/src/Model/Extra/Fields/OldUnixExtraField.php index faab175..df19377 100644 --- a/src/Model/Extra/Fields/OldUnixExtraField.php +++ b/src/Model/Extra/Fields/OldUnixExtraField.php @@ -62,7 +62,7 @@ use PhpZip\Model\ZipEntry; * mid-1994. Therefore future archiving software should continue to * support it. */ -class OldUnixExtraField implements ZipExtraField +final class OldUnixExtraField implements ZipExtraField { /** @var int Header id */ public const HEADER_ID = 0x5855; @@ -100,8 +100,8 @@ class OldUnixExtraField implements ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return OldUnixExtraField */ @@ -133,8 +133,8 @@ class OldUnixExtraField implements ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return OldUnixExtraField */ diff --git a/src/Model/Extra/Fields/UnicodeCommentExtraField.php b/src/Model/Extra/Fields/UnicodeCommentExtraField.php index 5111283..5795f8d 100644 --- a/src/Model/Extra/Fields/UnicodeCommentExtraField.php +++ b/src/Model/Extra/Fields/UnicodeCommentExtraField.php @@ -55,7 +55,7 @@ namespace PhpZip\Model\Extra\Fields; * * @see https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT section 4.6.8 */ -class UnicodeCommentExtraField extends AbstractUnicodeExtraField +final class UnicodeCommentExtraField extends AbstractUnicodeExtraField { public const HEADER_ID = 0x6375; diff --git a/src/Model/Extra/Fields/UnicodePathExtraField.php b/src/Model/Extra/Fields/UnicodePathExtraField.php index eb4957d..d0a64bf 100644 --- a/src/Model/Extra/Fields/UnicodePathExtraField.php +++ b/src/Model/Extra/Fields/UnicodePathExtraField.php @@ -56,7 +56,7 @@ namespace PhpZip\Model\Extra\Fields; * * @see https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT section 4.6.9 */ -class UnicodePathExtraField extends AbstractUnicodeExtraField +final class UnicodePathExtraField extends AbstractUnicodeExtraField { public const HEADER_ID = 0x7075; diff --git a/src/Model/Extra/Fields/UnrecognizedExtraField.php b/src/Model/Extra/Fields/UnrecognizedExtraField.php index 654ef13..f974b79 100644 --- a/src/Model/Extra/Fields/UnrecognizedExtraField.php +++ b/src/Model/Extra/Fields/UnrecognizedExtraField.php @@ -18,7 +18,7 @@ use PhpZip\Model\ZipEntry; /** * Simple placeholder for all those extra fields we don't want to deal with. */ -class UnrecognizedExtraField implements ZipExtraField +final class UnrecognizedExtraField implements ZipExtraField { private int $headerId; diff --git a/src/Model/Extra/Fields/WinZipAesExtraField.php b/src/Model/Extra/Fields/WinZipAesExtraField.php index 0152574..ae306da 100644 --- a/src/Model/Extra/Fields/WinZipAesExtraField.php +++ b/src/Model/Extra/Fields/WinZipAesExtraField.php @@ -24,7 +24,7 @@ use PhpZip\Model\ZipEntry; * * @see http://www.winzip.com/win/en/aes_tips.htm AES Coding Tips for Developers */ -class WinZipAesExtraField implements ZipExtraField +final class WinZipAesExtraField implements ZipExtraField { /** @var int Header id */ public const HEADER_ID = 0x9901; diff --git a/src/Model/Extra/Fields/Zip64ExtraField.php b/src/Model/Extra/Fields/Zip64ExtraField.php index f554dbe..f6fa64c 100644 --- a/src/Model/Extra/Fields/Zip64ExtraField.php +++ b/src/Model/Extra/Fields/Zip64ExtraField.php @@ -22,7 +22,7 @@ use PhpZip\Model\ZipEntry; * * @see https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT .ZIP File Format Specification */ -class Zip64ExtraField implements ZipExtraField +final class Zip64ExtraField implements ZipExtraField { /** @var int The Header ID for a ZIP64 Extended Information Extra Field. */ public const HEADER_ID = 0x0001; diff --git a/src/Model/Extra/ZipExtraField.php b/src/Model/Extra/ZipExtraField.php index 53bd44e..b080d40 100644 --- a/src/Model/Extra/ZipExtraField.php +++ b/src/Model/Extra/ZipExtraField.php @@ -30,8 +30,8 @@ interface ZipExtraField /** * Populate data from this array as if it was in local file data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return static */ @@ -40,8 +40,8 @@ interface ZipExtraField /** * Populate data from this array as if it was in central directory data. * - * @param string $buffer the buffer to read data from - * @param ?ZipEntry $entry + * @param string $buffer the buffer to read data from + * @param ZipEntry|null $entry optional zip entry * * @return static */ diff --git a/src/Model/ZipEntry.php b/src/Model/ZipEntry.php index df13175..6282c9a 100644 --- a/src/Model/ZipEntry.php +++ b/src/Model/ZipEntry.php @@ -943,13 +943,10 @@ class ZipEntry */ public function setEncryptionMethod(?int $encryptionMethod): self { - if ($encryptionMethod === null) { - $encryptionMethod = ZipEncryptionMethod::NONE; - } + $method = $encryptionMethod ?? ZipEncryptionMethod::NONE; - $encryptionMethod = (int) $encryptionMethod; - ZipEncryptionMethod::checkSupport($encryptionMethod); - $this->encryptionMethod = $encryptionMethod; + ZipEncryptionMethod::checkSupport($method); + $this->encryptionMethod = $method; $this->setEncrypted($this->encryptionMethod !== ZipEncryptionMethod::NONE); $this->extractVersion = self::UNKNOWN; diff --git a/src/Util/Iterator/IgnoreFilesRecursiveFilterIterator.php b/src/Util/Iterator/IgnoreFilesRecursiveFilterIterator.php index c0bccb7..19f0ecb 100644 --- a/src/Util/Iterator/IgnoreFilesRecursiveFilterIterator.php +++ b/src/Util/Iterator/IgnoreFilesRecursiveFilterIterator.php @@ -62,10 +62,11 @@ class IgnoreFilesRecursiveFilterIterator extends \RecursiveFilterIterator /** * @return IgnoreFilesRecursiveFilterIterator + * @psalm-suppress UndefinedInterfaceMethod + * @noinspection PhpPossiblePolymorphicInvocationInspection */ public function getChildren(): self { - /** @noinspection PhpPossiblePolymorphicInvocationInspection */ return new self($this->getInnerIterator()->getChildren(), $this->ignoreFiles); } } diff --git a/src/ZipFile.php b/src/ZipFile.php index 3e22cd8..fba3779 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -99,6 +99,7 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator throw new ZipException("File {$filename} does not exist."); } + /** @psalm-suppress InvalidArgument */ set_error_handler( static function (int $errorNumber, string $errorString): ?bool { throw new InvalidArgumentException($errorString, $errorNumber); @@ -417,6 +418,7 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator continue; } + /** @psalm-suppress InvalidArgument */ set_error_handler( static function (int $errorNumber, string $errorString) use ($entry, $file): ?bool { throw new ZipException( @@ -1454,6 +1456,7 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator { $tempFilename = $filename . '.temp' . uniqid('', false); + /** @psalm-suppress InvalidArgument */ set_error_handler( static function (int $errorNumber, string $errorString): ?bool { throw new InvalidArgumentException($errorString, $errorNumber); @@ -1479,7 +1482,7 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator } } - if (!@rename($tempFilename, $filename)) { + if (!rename($tempFilename, $filename)) { if (is_file($tempFilename)) { unlink($tempFilename); }