Skip to content

Commit 4d6c2fb

Browse files
committed
Throw ValueError for INF or NAN step
1 parent 5ab2d5c commit 4d6c2fb

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

ext/standard/array.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2685,6 +2685,16 @@ PHP_FUNCTION(range)
26852685
if (user_step) {
26862686
if (UNEXPECTED(Z_TYPE_P(user_step) == IS_DOUBLE)) {
26872687
step_double = Z_DVAL_P(user_step);
2688+
2689+
if (zend_isinf(step_double)) {
2690+
zend_argument_value_error(3, "must be a finite number, INF provided");
2691+
RETURN_THROWS();
2692+
}
2693+
if (zend_isnan(step_double)) {
2694+
zend_argument_value_error(3, "must be a finite number, NAN provided");
2695+
RETURN_THROWS();
2696+
}
2697+
26882698
/* We only want positive step values. */
26892699
if (step_double < 0.0) {
26902700
step_double *= -1;

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,38 @@ try {
2525
} catch (\ValueError $e) {
2626
echo $e->getMessage(), "\n";
2727
}
28+
echo "Step cannot be INF\n";
29+
try {
30+
var_dump( range(1.0, 7.0, 10.0**400) );
31+
} catch (\ValueError $e) {
32+
echo $e->getMessage(), "\n";
33+
}
34+
try {
35+
var_dump( range(1, 7, 10.0**400) );
36+
} catch (\ValueError $e) {
37+
echo $e->getMessage(), "\n";
38+
}
39+
try {
40+
var_dump( range('A', 'H', 10.0**400) );
41+
} catch (\ValueError $e) {
42+
echo $e->getMessage(), "\n";
43+
}
44+
echo "Step cannot be NAN\n";
45+
try {
46+
var_dump( range(1.0, 7.0, fdiv(0, 0)) );
47+
} catch (\ValueError $e) {
48+
echo $e->getMessage(), "\n";
49+
}
50+
try {
51+
var_dump( range(1, 7, fdiv(0, 0)) );
52+
} catch (\ValueError $e) {
53+
echo $e->getMessage(), "\n";
54+
}
55+
try {
56+
var_dump( range('A', 'H', fdiv(0, 0)) );
57+
} catch (\ValueError $e) {
58+
echo $e->getMessage(), "\n";
59+
}
2860

2961
echo "Step must be within the range of input parameters\n";
3062
echo "-- Testing ( (low < high) && (high-low < step) ) --\n";
@@ -62,6 +94,14 @@ range(): Argument #3 ($step) cannot be 0
6294
range(): Argument #3 ($step) cannot be 0
6395
range(): Argument #3 ($step) cannot be 0
6496
range(): Argument #3 ($step) cannot be 0
97+
Step cannot be INF
98+
range(): Argument #3 ($step) must be a finite number, INF provided
99+
range(): Argument #3 ($step) must be a finite number, INF provided
100+
range(): Argument #3 ($step) must be a finite number, INF provided
101+
Step cannot be NAN
102+
range(): Argument #3 ($step) must be a finite number, NAN provided
103+
range(): Argument #3 ($step) must be a finite number, NAN provided
104+
range(): Argument #3 ($step) must be a finite number, NAN provided
65105
Step must be within the range of input parameters
66106
-- Testing ( (low < high) && (high-low < step) ) --
67107
range(): Argument #3 ($step) must not exceed the specified range

0 commit comments

Comments
 (0)