diff --git a/src/Installing/Ini/RemoveIniEntryWithFileGetContents.php b/src/Installing/Ini/RemoveIniEntryWithFileGetContents.php index ffed9c30..adee0753 100644 --- a/src/Installing/Ini/RemoveIniEntryWithFileGetContents.php +++ b/src/Installing/Ini/RemoveIniEntryWithFileGetContents.php @@ -18,6 +18,8 @@ use function file_exists; use function file_get_contents; use function in_array; +use function is_array; +use function is_dir; use function preg_replace; use function scandir; use function sprintf; @@ -38,25 +40,28 @@ public function __invoke(Package $package, TargetPlatform $targetPlatform, Outpu } $additionalIniDirectory = $targetPlatform->phpBinaryPath->additionalIniDirectory(); - if ($additionalIniDirectory !== null) { - $allIniFiles = array_merge( - array_map( - static function (string $path) use ($additionalIniDirectory): string { - return $additionalIniDirectory . DIRECTORY_SEPARATOR . $path; - }, - array_filter( - scandir($additionalIniDirectory), - static function (string $path) use ($additionalIniDirectory): bool { - if (in_array($path, ['.', '..'])) { - return false; - } - - return file_exists($additionalIniDirectory . DIRECTORY_SEPARATOR . $path); + if ($additionalIniDirectory !== null && file_exists($additionalIniDirectory) && is_dir($additionalIniDirectory)) { + $filenames = scandir($additionalIniDirectory); + if (is_array($filenames)) { + $allIniFiles = array_merge( + array_map( + static function (string $path) use ($additionalIniDirectory): string { + return $additionalIniDirectory . DIRECTORY_SEPARATOR . $path; }, + array_filter( + $filenames, + static function (string $path) use ($additionalIniDirectory): bool { + if (in_array($path, ['.', '..'])) { + return false; + } + + return file_exists($additionalIniDirectory . DIRECTORY_SEPARATOR . $path); + }, + ), ), - ), - $allIniFiles, - ); + $allIniFiles, + ); + } } // Make sure all symlinks are resolved diff --git a/test/unit/Installing/Ini/RemoveIniEntryWithFileGetContentsTest.php b/test/unit/Installing/Ini/RemoveIniEntryWithFileGetContentsTest.php index e596825e..76259787 100644 --- a/test/unit/Installing/Ini/RemoveIniEntryWithFileGetContentsTest.php +++ b/test/unit/Installing/Ini/RemoveIniEntryWithFileGetContentsTest.php @@ -128,6 +128,46 @@ public function testRelevantIniFilesHaveExtensionRemoved(ExtensionType $extensio ); } + #[DataProvider('extensionTypeProvider')] + public function testNonExistentAdditionalIniDirectoryDoesNotCrash(ExtensionType $extensionType): void + { + $phpBinaryPath = $this->createMock(PhpBinaryPath::class); + $phpBinaryPath + ->method('loadedIniConfigurationFile') + ->willReturn(null); + $phpBinaryPath + ->method('additionalIniDirectory') + ->willReturn('/this/path/should/not/exist/for/testing'); + + $package = new Package( + $this->createMock(CompletePackageInterface::class), + $extensionType, + ExtensionName::normaliseFromString('foobar'), + 'foobar/foobar', + '1.2.3', + null, + ); + + $targetPlatform = new TargetPlatform( + OperatingSystem::NonWindows, + OperatingSystemFamily::Linux, + $phpBinaryPath, + Architecture::x86_64, + ThreadSafetyMode::ThreadSafe, + 1, + null, + ); + + self::assertSame( + [], + (new RemoveIniEntryWithFileGetContents())( + $package, + $targetPlatform, + $this->createMock(OutputInterface::class), + ), + ); + } + #[RequiresOperatingSystemFamily('Linux')] public function testSymlinkedIniFilesAreResolved(): void {