]> granicus.if.org Git - php/commitdiff
Make is_file() and friends return false when path contains 0-byte
authorChristian Schneider <schneider@search.ch>
Wed, 2 Dec 2020 09:21:08 +0000 (10:21 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 3 Dec 2020 08:43:15 +0000 (09:43 +0100)
These functions now return false silently:
is_writable, is_readable, is_executable, is_file, is_dir, is_link,
file_exists

These functions now throw a warning an return false (rather than
throwing a ValueError):
fileperms, fileinode, filesize, fileowner, filegroup, filetype,
fileatime, filemtime, filectime, lstat, stat

See also https://externals.io/message/112333.

Closes GH-6478.

ext/standard/filestat.c
ext/standard/tests/file/bug39863.phpt
ext/standard/tests/file/filegroup_variation3.phpt
ext/standard/tests/file/fileinode_variation3.phpt
ext/standard/tests/file/fileowner_variation3.phpt
ext/standard/tests/file/fileperms_variation3.phpt
ext/standard/tests/file/is_dir_variation4.phpt
ext/standard/tests/file/is_executable_variation1.phpt
ext/standard/tests/file/is_file_variation4.phpt
ext/standard/tests/file/is_readable_variation1.phpt
ext/standard/tests/file/is_writable_variation1.phpt

index 61546c3da6368703f62f22eb44cfad0f7d0ef727..303e919c19ddc8e4c1a7971819702b7de63ab3f2 100644 (file)
@@ -728,7 +728,10 @@ PHPAPI void php_stat(const char *filename, size_t filename_length, int type, zva
        const char *local;
        php_stream_wrapper *wrapper;
 
-       if (!filename_length) {
+       if (!filename_length || CHECK_NULL_PATH(filename, filename_length)) {
+               if (filename_length && !IS_EXISTS_CHECK(type)) {
+                       php_error_docref(NULL, E_WARNING, "Filename contains null byte");
+               }
                RETURN_FALSE;
        }
 
@@ -937,7 +940,7 @@ ZEND_NAMED_FUNCTION(name) { \
        size_t filename_len; \
        \
        ZEND_PARSE_PARAMETERS_START(1, 1) \
-               Z_PARAM_PATH(filename, filename_len) \
+               Z_PARAM_STRING(filename, filename_len) \
        ZEND_PARSE_PARAMETERS_END(); \
        \
        php_stat(filename, filename_len, funcnum, return_value); \
index c69cb6d0a65c24135adaa3826b4d8e0032358510..88c569473a76e0b49b329608138017d23ce44c05 100644 (file)
@@ -6,12 +6,7 @@ Andrew van der Stock, vanderaj @ owasp.org
 <?php
 
 $filename = __FILE__ . chr(0). ".ridiculous";
-
-try {
-    var_dump(file_exists($filename));
-} catch (ValueError $e) {
-    echo $e->getMessage(), "\n";
-}
+var_dump(file_exists($filename));
 ?>
 --EXPECT--
-file_exists(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
index d18da058555ec98d96991a3363e495116b552e82..e844be0772125c70fedeb74abed6803812cd64f2 100644 (file)
@@ -75,8 +75,12 @@ bool(false)
 Warning: filegroup(): stat failed for %s/filegroup_variation3/filegroup*.tmp in %s on line %d
 bool(false)
 - Iteration 7 -
-filegroup(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: filegroup(): Filename contains null byte in %s on line %d
+bool(false)
 - Iteration 8 -
-filegroup(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: filegroup(): Filename contains null byte in %s on line %d
+bool(false)
 
 *** Done ***
index 1158308687a15495f9207235c6a8aa2122cedd0d..92357a3619e83ccc9b9755ca76d7b3e5544a93e9 100644 (file)
@@ -74,8 +74,12 @@ bool(false)
 Warning: fileinode(): stat failed for %s/fileinode_variation3/fileinode*.tmp in %s on line %d
 bool(false)
 - Iteration 7 -
-fileinode(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileinode(): Filename contains null byte in %s on line %d
+bool(false)
 - Iteration 8 -
-fileinode(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileinode(): Filename contains null byte in %s on line %d
+bool(false)
 
 *** Done ***
index a61b0ab0a341743938b3bcadc396030c54afd5b2..63ba6936aaa8daac0039ebf55015becb11042ca0 100644 (file)
@@ -75,8 +75,12 @@ bool(false)
 Warning: fileowner(): stat failed for %s/fileowner_variation3/fileowner*.tmp in %s on line %d
 bool(false)
 - Iteration 7 -
-fileowner(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileowner(): Filename contains null byte in %s on line %d
+bool(false)
 - Iteration 8 -
-fileowner(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileowner(): Filename contains null byte in %s on line %d
+bool(false)
 
 *** Done ***
index ada750bbab49792c9a9f2cb919b0c2956e3f0fb7..5e981e9b863203992a59495edd2fd48da7cda8c1 100644 (file)
@@ -74,8 +74,12 @@ bool(false)
 Warning: fileperms(): stat failed for %s/fileperms_variation3/fileperms*.tmp in %s on line %d
 bool(false)
 - Iteration 7 -
-fileperms(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileperms(): Filename contains null byte in %s on line %d
+bool(false)
 - Iteration 8 -
-fileperms(): Argument #1 ($filename) must not contain any null bytes
+
+Warning: fileperms(): Filename contains null byte in %s on line %d
+bool(false)
 
 *** Done ***
index 8a1563992f23cba65f8866854f5965708a0d6eec..d6e64efe211cd28d6418d4ed914c548e4ebfa5e6 100644 (file)
@@ -76,9 +76,9 @@ bool(true)
 bool(false)
 
 -- Iteration 9 --
-is_dir(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 
 -- Iteration 10 --
-is_dir(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 
 *** Done ***
index de08c1d9170c5f1b42da295b892be4c28de8212d..a85b9a2ef02837c58caa48feac25b2acce7996fd 100644 (file)
@@ -76,9 +76,9 @@ bool(false)
 -- Iteration 5 --
 bool(false)
 -- Iteration 6 --
-is_executable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 -- Iteration 7 --
-is_executable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 -- Iteration 8 --
 bool(false)
 -- Iteration 9 --
index f6921d1d87262a90b4fbc3413db822074ee9a824..1afc34dd03bea9566dcf7654a48251a491e5d8ed 100644 (file)
@@ -66,8 +66,8 @@ bool(false)
 - Iteration 6 -
 bool(false)
 - Iteration 7 -
-is_file(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 - Iteration 8 -
-is_file(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 
 *** Done ***
index d46e5fa5ca8505b5af4ea2199640d87ae1588d35..9c25213f8abb235a01cb117df0dda1752f907d79 100644 (file)
@@ -77,11 +77,11 @@ bool(false)
 -- Iteration 6 --
 bool(false)
 -- Iteration 7 --
-is_readable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 -- Iteration 8 --
-is_readable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 -- Iteration 9 --
-is_readable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
 -- Iteration 10 --
 bool(true)
 -- Iteration 11 --
index 9361ec947c194f7ec7ed288b98d1751dabb3111c..80695d6d45a25f7e564508c4288d23a02dcbc47c 100644 (file)
@@ -87,14 +87,14 @@ bool(false)
 bool(false)
 bool(false)
 -- Iteration 7 --
-is_writable(): Argument #1 ($filename) must not contain any null bytes
-is_writeable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
+bool(false)
 -- Iteration 8 --
-is_writable(): Argument #1 ($filename) must not contain any null bytes
-is_writeable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
+bool(false)
 -- Iteration 9 --
-is_writable(): Argument #1 ($filename) must not contain any null bytes
-is_writeable(): Argument #1 ($filename) must not contain any null bytes
+bool(false)
+bool(false)
 -- Iteration 10 --
 bool(true)
 bool(true)