Skip to content

Commit 28b6a00

Browse files
committed
Revert "Make empty strings an error"
This reverts commit 75c76d6.
1 parent 8c72941 commit 28b6a00

File tree

3 files changed

+43
-14
lines changed

3 files changed

+43
-14
lines changed

ext/standard/array.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,8 +2688,14 @@ static uint8_t php_range_process_input(const zval *input, uint32_t arg_num, zend
26882688
return IS_DOUBLE;
26892689
case IS_STRING: {
26902690
if (Z_STRLEN_P(input) == 0) {
2691-
zend_argument_value_error(arg_num, "must not be empty");
2692-
return 0;
2691+
const char *arg_name = get_active_function_arg_name(arg_num);
2692+
php_error_docref(NULL, E_WARNING, "Argument #%d ($%s) must not be empty, casted to 0", arg_num, arg_name);
2693+
if (UNEXPECTED(EG(exception))) {
2694+
return 0;
2695+
}
2696+
*lval = 0;
2697+
*dval = 0.0;
2698+
return IS_LONG;
26932699
}
26942700
uint8_t type = is_numeric_str_function(Z_STR_P(input), lval, dval);
26952701
if (type == IS_DOUBLE) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #32021 (Crash caused by range('', 'z'))
3+
--FILE--
4+
<?php
5+
$foo = range('', 'z');
6+
var_dump($foo);
7+
?>
8+
ALIVE
9+
--EXPECTF--
10+
Warning: range(): Argument #1 ($start) must not be empty, casted to 0 in %s on line %d
11+
12+
Warning: range(): Argument #1 ($start) must be a string if argument #2 ($end) is a string, argument #2 ($end) converted to 0 in %s on line %d
13+
array(1) {
14+
[0]=>
15+
int(0)
16+
}
17+
ALIVE

ext/standard/tests/array/range/range_inputs_string_invalid.phpt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,8 @@ echo "Range will ignore any byte after the first one\n";
99
var_dump( range("AA", "BB") );
1010

1111
echo "Range cannot operate on an empty string\n";
12-
try {
13-
var_dump( range("Z", "") );
14-
} catch (ValueError $e) {
15-
echo $e->getMessage(), "\n";
16-
}
17-
try {
18-
var_dump( range("", "Z") );
19-
} catch (ValueError $e) {
20-
echo $e->getMessage(), "\n";
21-
}
12+
var_dump( range("Z", "") ); // Both strings are cast to int, i.e. 0
13+
var_dump( range("", "Z") ); // Both strings are cast to int, i.e. 0
2214

2315
echo "Mixing numeric string and character\n";
2416
var_dump( range("1", "A") ); // The char is cast to an int, i.e. 0
@@ -44,8 +36,22 @@ array(2) {
4436
string(1) "B"
4537
}
4638
Range cannot operate on an empty string
47-
range(): Argument #2 ($end) must not be empty
48-
range(): Argument #1 ($start) must not be empty
39+
40+
Warning: range(): Argument #2 ($end) must not be empty, casted to 0 in %s on line %d
41+
42+
Warning: range(): Argument #2 ($end) must be a string if argument #1 ($start) is a string, argument #1 ($start) converted to 0 in %s on line %d
43+
array(1) {
44+
[0]=>
45+
int(0)
46+
}
47+
48+
Warning: range(): Argument #1 ($start) must not be empty, casted to 0 in %s on line %d
49+
50+
Warning: range(): Argument #1 ($start) must be a string if argument #2 ($end) is a string, argument #2 ($end) converted to 0 in %s on line %d
51+
array(1) {
52+
[0]=>
53+
int(0)
54+
}
4955
Mixing numeric string and character
5056

5157
Warning: range(): Argument #1 ($start) must be a string if argument #2 ($end) is a string, argument #2 ($end) converted to 0 in %s on line %d

0 commit comments

Comments
 (0)