Bug #70943 [Com]: fopen() can't open a file if path is 259 characters long

From: Date: Sat, 19 Dec 2015 01:08:21 +0000
Subject: Bug #70943 [Com]: fopen() can't open a file if path is 259 characters long
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-198012@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=70943&edit=1 ID: 70943 Comment by: webmaster at tubo-world dot de Reported by: emanuele at fondani dot it Summary: fopen() can't open a file if path is 259 characters long Status: Open Type: Bug Package: Filesystem function related Operating System: Windows 10 PHP Version: 5.6.15 Block user comment: N Private report: N New Comment: I confirm the problem and investigated which filesystem functions work with different lengths of filenames. In theory filesnames up to 259 length should work on Windows as it is below the 260 MAX_PATH length (including terminating null char). I could find out that some functions work with length 259 (touch, rename, file_exists etc), while other functions fail (copy, fopen, realpath, file_put_contents) for the same filename. So for these functions PHP does seem to do something inconsistently in a bad way which causes hard to debug problems. Test script: ------------ <?php $tmpDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR; $tmpDirLen = strlen($tmpDir); foreach (array(258, 259, 260) as $fileLen) { $filename = $tmpDir . str_repeat('a', $fileLen - $tmpDirLen); var_dump($filename); echo 'touch: '; var_dump(@touch($filename)); echo 'chmod: '; var_dump(@chmod($filename, 0666)); echo 'file_exists: '; var_dump(file_exists($filename)); echo 'is_file: '; var_dump(is_file($filename)); echo 'stat: '; var_dump(@stat($filename) ? true : false); echo 'realpath: '; var_dump(realpath($filename) ? true : false); echo 'fopen: '; var_dump(($handle = @fopen($filename, 'r')) ? true : false); if ($handle) { fclose($handle); } echo 'unlink: '; var_dump(@unlink($filename)); $tmpFile = tempnam(sys_get_temp_dir(), 'tmp'); echo 'copy: '; var_dump(@copy($tmpFile, $filename)); echo 'file_put_contents: '; var_dump(@file_put_contents($filename, 'test data') ? true : false); echo 'rename: '; var_dump($rename = @rename($tmpFile, $filename)); unlink($rename ? $filename : $tmpFile); echo "\n\n"; } Expected result: ---------------- string(258) "..." touch: bool(true) chmod: bool(true) file_exists: bool(true) is_file: bool(true) stat: bool(true) realpath: bool(true) fopen: bool(true) unlink: bool(true) copy: bool(true) file_put_contents: bool(true) rename: bool(true) string(259) "..." touch: bool(true) chmod: bool(true) file_exists: bool(true) is_file: bool(true) stat: bool(true) realpath: bool(true) fopen: bool(true) unlink: bool(true) copy: bool(true) file_put_contents: bool(true) rename: bool(true) string(260) "..." touch: bool(false) chmod: bool(false) file_exists: bool(false) is_file: bool(false) stat: bool(false) realpath: bool(false) fopen: bool(false) unlink: bool(false) copy: bool(false) file_put_contents: bool(false) rename: bool(false) Actual result: -------------- string(258) "..." touch: bool(true) chmod: bool(true) file_exists: bool(true) is_file: bool(true) stat: bool(true) realpath: bool(true) fopen: bool(true) unlink: bool(true) copy: bool(true) file_put_contents: bool(true) rename: bool(true) string(259) "..." touch: bool(true) chmod: bool(true) file_exists: bool(true) is_file: bool(true) stat: bool(true) realpath: bool(false) fopen: bool(false) unlink: bool(true) copy: bool(false) file_put_contents: bool(false) rename: bool(true) string(260) "..." touch: bool(false) chmod: bool(false) file_exists: bool(false) is_file: bool(false) stat: bool(false) realpath: bool(false) fopen: bool(false) unlink: bool(false) copy: bool(false) file_put_contents: bool(false) rename: bool(false) Previous Comments: ------------------------------------------------------------------------ [2015-12-18 22:43:46] nathanael at gnat dot ca I have the same problem on Windows Server 2008, php 5.6.16 ------------------------------------------------------------------------ [2015-12-08 07:58:30] a dot ehrsam at hotmail dot com I think we have the following limitation of Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath . This has been a discussion for .NET as well: https://github.com/dotnet/corefx/issues/645 ------------------------------------------------------------------------ [2015-12-08 06:52:45] yohgaki@php.net Note: Most file systems support up to 255 chars for file names. Path length are unlimited mostly. https://en.wikipedia.org/wiki/Comparison_of_file_systems ------------------------------------------------------------------------ [2015-11-30 07:06:45] adrian dot ehrsam at students dot fhnw dot ch This is an issue of composer as well: https://github.com/composer/composer/issues/4628 . It is the well-known Windows Long path Issue that can be fixed. ------------------------------------------------------------------------ [2015-11-19 18:01:09] emanuele at fondani dot it Description: ------------ fopen() function cannot access files whose path is more than 258 characters long. Test script: --------------- <?php // Generates a sample file whose path is exactly 259 characters long $testFile = __DIR__."\\".str_repeat("a", 254 - strlen(__DIR__)).".dat"; echo "Generating a file with a path length of ".strlen($testFile)." characters...\r\n"; touch($testFile); echo "Opening file... "; if ($fp = fopen($testFile, "r")) { fclose($fp); echo "OK"; } Expected result: ---------------- Generating a file with a path length of 259 characters... Opening file... OK Actual result: -------------- Generating a file with a path length of 259 characters... Opening file... Warning: fopen(S:\Emanuele\Temp\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.dat): failed to open stream: Invalid argument in test.php on line 8 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=70943&edit=1

« previous php.bugs (#198012) next »