Skip to content

Commit 39052d4

Browse files
tpuntweltling
authored andcommitted
Resolve bug #72017
1 parent 6f48605 commit 39052d4

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

ext/standard/array.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2104,7 +2104,7 @@ PHP_FUNCTION(array_fill_keys)
21042104
php_error_docref(NULL, E_WARNING, "The supplied range exceeds the maximum array size: start=%0.0f end=%0.0f", end, start); \
21052105
RETURN_FALSE; \
21062106
} \
2107-
size = (uint32_t)__calc_size; \
2107+
size = (uint32_t)round(__calc_size); \
21082108
array_init_size(return_value, size); \
21092109
zend_hash_real_init(Z_ARRVAL_P(return_value), 1); \
21102110
} while (0)
@@ -2216,7 +2216,7 @@ PHP_FUNCTION(range)
22162216
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
22172217
}
22182218
} else if (Z_TYPE_P(zlow) == IS_DOUBLE || Z_TYPE_P(zhigh) == IS_DOUBLE || is_step_double) {
2219-
double low, high;
2219+
double low, high, element;
22202220
uint32_t i, size;
22212221
double_str:
22222222
low = zval_get_double(zlow);
@@ -2237,8 +2237,8 @@ PHP_FUNCTION(range)
22372237
RANGE_CHECK_DOUBLE_INIT_ARRAY(low, high);
22382238

22392239
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) {
2240-
for (i = 0; i < size; ++i) {
2241-
Z_DVAL(tmp) = low - (i * step);
2240+
for (i = 0; i < size && (element = low - (i * step)) <= low && element >= high; ++i) {
2241+
Z_DVAL(tmp) = element;
22422242
ZEND_HASH_FILL_ADD(&tmp);
22432243
}
22442244
} ZEND_HASH_FILL_END();
@@ -2251,8 +2251,8 @@ PHP_FUNCTION(range)
22512251
RANGE_CHECK_DOUBLE_INIT_ARRAY(high, low);
22522252

22532253
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) {
2254-
for (i = 0; i < size; ++i) {
2255-
Z_DVAL(tmp) = low + (i * step);
2254+
for (i = 0; i < size && (element = low + (i * step)) <= high && element >= low; ++i) {
2255+
Z_DVAL(tmp) = element;
22562256
ZEND_HASH_FILL_ADD(&tmp);
22572257
}
22582258
} ZEND_HASH_FILL_END();
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
Bug #72017 (incorrect truncation due to floating point precision issue)
3+
--FILE--
4+
<?php
5+
var_dump(range(4.5, 4.2, 0.1));
6+
?>
7+
--EXPECT--
8+
array(4) {
9+
[0]=>
10+
float(4.5)
11+
[1]=>
12+
float(4.4)
13+
[2]=>
14+
float(4.3)
15+
[3]=>
16+
float(4.2)
17+
}

0 commit comments

Comments
 (0)