From c726ea20fd83900622e519c80ab35f3a9f3229d0 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Mon, 19 Jun 2023 18:46:05 +0200 Subject: [PATCH 1/3] fix file() flags error-check the old flag check was flawed and would miss some flags, for example: file(__FILE__, FILE_APPEND); is invalid, but the old flags error check would miss it: https://3v4l.org/b2W9u --- ext/standard/file.c | 3 +- ext/standard/tests/file/file_error.phpt | 16 +++- ext/standard/tests/file/file_variation6.phpt | 80 ++------------------ 3 files changed, 22 insertions(+), 77 deletions(-) diff --git a/ext/standard/file.c b/ext/standard/file.c index f06b672fb673..46aa57ef0c70 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -619,7 +619,8 @@ PHP_FUNCTION(file) Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); - if (flags < 0 || flags > (PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) { + if ((flags & ~(PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) != 0) + { zend_argument_value_error(2, "must be a valid flag value"); RETURN_THROWS(); } diff --git a/ext/standard/tests/file/file_error.phpt b/ext/standard/tests/file/file_error.phpt index 163943a3db39..69bb93c0b7ae 100644 --- a/ext/standard/tests/file/file_error.phpt +++ b/ext/standard/tests/file/file_error.phpt @@ -7,8 +7,16 @@ echo "\n*** Testing error conditions ***\n"; $file_handle = fopen($file_path."/file.tmp", "w"); $filename = $file_path."/file.tmp"; -var_dump( file($filename, 10, NULL) ); // Incorrect flag - +try { + var_dump( file($filename, 10, NULL) ); // Incorrect flag +} catch(ValueError $e) { + echo "ValueError: " . $e->getMessage() . "\n"; +} +try { + var_dump( file($filename, FILE_APPEND) ); // Incorrect flag +} catch(ValueError $e) { + echo "ValueError: " . $e->getMessage() . "\n"; +} var_dump( file("temp.tmp") ); // non existing filename fclose($file_handle); @@ -21,8 +29,8 @@ unlink($file_path."/file.tmp"); ?> --EXPECTF-- *** Testing error conditions *** -array(0) { -} +ValueError: file(): Argument #2 ($flags) must be a valid flag value +ValueError: file(): Argument #2 ($flags) must be a valid flag value Warning: file(temp.tmp): Failed to open stream: No such file or directory in %s on line %d bool(false) diff --git a/ext/standard/tests/file/file_variation6.phpt b/ext/standard/tests/file/file_variation6.phpt index 6444c7f36675..9bd91cfd40de 100644 --- a/ext/standard/tests/file/file_variation6.phpt +++ b/ext/standard/tests/file/file_variation6.phpt @@ -95,78 +95,14 @@ array(3) { [2]=> string(6) "Line 3" } -array(3) { - [0]=> - string(7) "Line 1 -" - [1]=> - string(7) "Line 2 -" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(7) "Line 1 -" - [1]=> - string(7) "Line 2 -" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(6) "Line 1" - [1]=> - string(6) "Line 2" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(6) "Line 1" - [1]=> - string(6) "Line 2" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(7) "Line 1 -" - [1]=> - string(7) "Line 2 -" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(7) "Line 1 -" - [1]=> - string(7) "Line 2 -" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(6) "Line 1" - [1]=> - string(6) "Line 2" - [2]=> - string(6) "Line 3" -} -array(3) { - [0]=> - string(6) "Line 1" - [1]=> - string(6) "Line 2" - [2]=> - string(6) "Line 3" -} +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value +file(): Argument #2 ($flags) must be a valid flag value array(3) { [0]=> string(7) "Line 1 From 4d7a4f12c2ac79ba2c2587398b9193a884b68fa0 Mon Sep 17 00:00:00 2001 From: divinity76 Date: Wed, 21 Jun 2023 20:51:49 +0200 Subject: [PATCH 2/3] formatting error --- ext/standard/file.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/standard/file.c b/ext/standard/file.c index 46aa57ef0c70..f6076438f69d 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -619,8 +619,7 @@ PHP_FUNCTION(file) Z_PARAM_RESOURCE_OR_NULL(zcontext) ZEND_PARSE_PARAMETERS_END(); - if ((flags & ~(PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) != 0) - { + if ((flags & ~(PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) != 0) { zend_argument_value_error(2, "must be a valid flag value"); RETURN_THROWS(); } From efb4432fd87324dd58645d988212ab59dc80270a Mon Sep 17 00:00:00 2001 From: divinity76 Date: Thu, 22 Jun 2023 10:06:28 +0200 Subject: [PATCH 3/3] file() flags UPGRADING note --- UPGRADING | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UPGRADING b/UPGRADING index 1f6df9e88031..adca0058137f 100644 --- a/UPGRADING +++ b/UPGRADING @@ -52,6 +52,9 @@ PHP 8.3 UPGRADE NOTES . C functions that have a return type of void now return null instead of returning the following object object(FFI\CData:void) { } +- Filesystem: + . file() flags error check now catches all invalid flags, notably FILE_APPEND, previously some invalid flags were silently accepted ( https://github.com/php/php-src/pull/11483 ) + ======================================== 2. New Features ======================================== @@ -329,3 +332,6 @@ PHP 8.3 UPGRADE NOTES ======================================== 14. Performance Improvements ======================================== + +- Filesystem: + . file() flags error check is now about 7% faster ( https://github.com/php/php-src/pull/11483 )