@@ -318,6 +318,8 @@ private function isReadable(string $filename): bool
318318 */
319319 public function symlink ($ originDir , $ targetDir , $ copyOnWindows = false )
320320 {
321+ self ::assertFunctionExists ('symlink ' );
322+
321323 if ('\\' === \DIRECTORY_SEPARATOR ) {
322324 $ originDir = strtr ($ originDir , '/ ' , '\\' );
323325 $ targetDir = strtr ($ targetDir , '/ ' , '\\' );
@@ -354,6 +356,8 @@ public function symlink($originDir, $targetDir, $copyOnWindows = false)
354356 */
355357 public function hardlink ($ originFile , $ targetFiles )
356358 {
359+ self ::assertFunctionExists ('link ' );
360+
357361 if (!$ this ->exists ($ originFile )) {
358362 throw new FileNotFoundException (null , 0 , null , $ originFile );
359363 }
@@ -737,13 +741,22 @@ private function getSchemeAndHierarchy(string $filename): array
737741 return 2 === \count ($ components ) ? [$ components [0 ], $ components [1 ]] : [null , $ components [0 ]];
738742 }
739743
744+ private static function assertFunctionExists (string $ func ): void
745+ {
746+ if (!\function_exists ($ func )) {
747+ throw new IOException (sprintf ('Unable to perform filesystem operation because the "%s()" function has been disabled. ' , $ func ));
748+ }
749+ }
750+
740751 /**
741752 * @param mixed ...$args
742753 *
743754 * @return mixed
744755 */
745- private static function box (callable $ func , ...$ args )
756+ private static function box (string $ func , ...$ args )
746757 {
758+ self ::assertFunctionExists ($ func );
759+
747760 self ::$ lastError = null ;
748761 set_error_handler (__CLASS__ .'::handleError ' );
749762 try {
0 commit comments