Skip to content

Commit

Permalink
fix file() flags error-check
Browse files Browse the repository at this point in the history
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

Closes GH-11483
  • Loading branch information
divinity76 authored and iluuu1994 committed Jun 23, 2023
1 parent 3c87266 commit 3b0e619
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 77 deletions.
5 changes: 5 additions & 0 deletions UPGRADING
Expand Up @@ -68,6 +68,8 @@ PHP 8.3 UPGRADE NOTES
* range() now produce a list of characters if one of the boundary inputs is
a string digit instead of casting the other input to int
(e.g. range('5', 'z');)
. The file() flags error check now catches all invalid flags. Notably
FILE_APPEND was previously silently accepted.

========================================
2. New Features
Expand Down Expand Up @@ -355,3 +357,6 @@ PHP 8.3 UPGRADE NOTES
========================================
14. Performance Improvements
========================================

- Standard:
. The file() flags error check is now about 7% faster.
2 changes: 1 addition & 1 deletion ext/standard/file.c
Expand Up @@ -619,7 +619,7 @@ 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();
}
Expand Down
16 changes: 12 additions & 4 deletions ext/standard/tests/file/file_error.phpt
Expand Up @@ -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);

Expand All @@ -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)
Expand Down
80 changes: 8 additions & 72 deletions ext/standard/tests/file/file_variation6.phpt
Expand Up @@ -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
Expand Down

0 comments on commit 3b0e619

Please sign in to comment.