1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/standard: validate mode in array_filter() (#15647)

And add the missing ARRAY_FILTER_USE_VALUE for the default case.
This commit is contained in:
Jorg Adam Sowa
2026-01-26 17:02:15 +01:00
committed by GitHub
parent 8c4c43082f
commit 6d95a2238d
7 changed files with 42 additions and 3 deletions

2
NEWS
View File

@@ -99,6 +99,8 @@ PHP NEWS
- Standard:
. Fixed bug GH-19926 (reset internal pointer earlier while splicing array
while COW violation flag is still set). (alexandre-daubois)
. Invalid mode values now throw in array_filter() instead of being silently
defaulted to 0. (Jorg Sowa)
- Streams:
. Added so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt stream

View File

@@ -23,6 +23,10 @@ PHP 8.6 UPGRADE NOTES
. Invalid values now throw in Phar::mungServer() instead of being silently
ignored.
- Standard:
. Invalid mode values now throw in array_filter() instead of being silently
defaulted to 0.
========================================
2. New Features
========================================

View File

@@ -6453,7 +6453,7 @@ PHP_FUNCTION(array_filter)
zval args[2];
zval retval;
bool have_callback = 0;
zend_long use_type = 0;
zend_long use_type = ARRAY_FILTER_USE_VALUE;
zend_string *string_key;
zend_fcall_info fci = empty_fcall_info;
zend_fcall_info_cache fci_cache;
@@ -6466,6 +6466,16 @@ PHP_FUNCTION(array_filter)
Z_PARAM_LONG(use_type)
ZEND_PARSE_PARAMETERS_END();
switch (use_type) {
case ARRAY_FILTER_USE_VALUE:
case ARRAY_FILTER_USE_BOTH:
case ARRAY_FILTER_USE_KEY:
break;
default:
zend_argument_value_error(3, "must be one of ARRAY_FILTER_USE_VALUE, ARRAY_FILTER_USE_KEY, or ARRAY_FILTER_USE_BOTH");
RETURN_THROWS();
}
if (zend_hash_num_elements(Z_ARRVAL_P(array)) == 0) {
RETVAL_EMPTY_ARRAY();
return;
@@ -6486,7 +6496,7 @@ PHP_FUNCTION(array_filter)
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, operand) {
if (have_callback) {
if (use_type) {
if (use_type != ARRAY_FILTER_USE_VALUE) {
/* Set up the key */
if (!string_key) {
ZVAL_LONG(key, num_key);

View File

@@ -109,6 +109,11 @@ const COUNT_NORMAL = UNKNOWN;
*/
const COUNT_RECURSIVE = UNKNOWN;
/**
* @var int
* @cvalue ARRAY_FILTER_USE_VALUE
*/
const ARRAY_FILTER_USE_VALUE = UNKNOWN;
/**
* @var int
* @cvalue ARRAY_FILTER_USE_BOTH

View File

@@ -1,5 +1,5 @@
/* This is a generated file, edit basic_functions.stub.php instead.
* Stub hash: 1a1667a5c59111f096a758d5bb4aa7cf3ec09cfe */
* Stub hash: a4324854949e2df355625c18a4e26d066c8f7a17 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -3530,6 +3530,7 @@ static void register_basic_functions_symbols(int module_number)
REGISTER_LONG_CONSTANT("CASE_UPPER", PHP_CASE_UPPER, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("COUNT_NORMAL", PHP_COUNT_NORMAL, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", PHP_COUNT_RECURSIVE, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_VALUE", ARRAY_FILTER_USE_VALUE, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_PERSISTENT);
zend_constant *const_ASSERT_ACTIVE = REGISTER_LONG_CONSTANT("ASSERT_ACTIVE", PHP_ASSERT_ACTIVE, CONST_PERSISTENT | CONST_DEPRECATED);

View File

@@ -59,6 +59,7 @@ PHPAPI bool php_array_pick_keys(php_random_algo_with_state engine, zval *input,
#define PHP_COUNT_NORMAL 0
#define PHP_COUNT_RECURSIVE 1
#define ARRAY_FILTER_USE_VALUE 0
#define ARRAY_FILTER_USE_BOTH 1
#define ARRAY_FILTER_USE_KEY 2

View File

@@ -0,0 +1,16 @@
--TEST--
Test array_filter() function : usage variations - mode exception
--FILE--
<?php
try {
var_dump(array_filter([], mode: 999));
} catch (Throwable $e) {
echo $e::class . ': '.$e->getMessage(), "\n";
}
echo "Done"
?>
--EXPECT--
ValueError: array_filter(): Argument #3 ($mode) must be one of ARRAY_FILTER_USE_VALUE, ARRAY_FILTER_USE_KEY, or ARRAY_FILTER_USE_BOTH
Done