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:
2
NEWS
2
NEWS
@@ -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
|
||||
|
||||
@@ -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
|
||||
========================================
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
3
ext/standard/basic_functions_arginfo.h
generated
3
ext/standard/basic_functions_arginfo.h
generated
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
16
ext/standard/tests/array/array_filter_invalid_mode.phpt
Normal file
16
ext/standard/tests/array/array_filter_invalid_mode.phpt
Normal 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
|
||||
Reference in New Issue
Block a user