From ee47669e8ae7e6addce2d13d77f946f98077f333 Mon Sep 17 00:00:00 2001 From: divinity76 Date: Sat, 19 Oct 2024 16:41:16 +0200 Subject: [PATCH 1/8] improve range array overflow error message added info about "how much it exceeded" and the maximum allowable array size. Makes debugging easier when encountering this specific issue. --- ext/standard/array.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 8f6418b032731..36fe9984abaa7 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2861,8 +2861,11 @@ PHP_FUNCTION(array_fill_keys) #define RANGE_CHECK_DOUBLE_INIT_ARRAY(start, end, _step) do { \ double __calc_size = ((start - end) / (_step)) + 1; \ if (__calc_size >= (double)HT_MAX_SIZE) { \ + double __exceed_by = __calc_size - (double)HT_MAX_SIZE; \ zend_value_error(\ - "The supplied range exceeds the maximum array size: start=%0.1f end=%0.1f step=%0.1f", end, start, (_step)); \ + "The supplied range exceeds the maximum array size by %.1f elements: " \ + "start=%.1f, end=%.1f, step=%.1f. Max size: %.0f", \ + __exceed_by, end, start, (_step), (double)HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ size = (uint32_t)_php_math_round(__calc_size, 0, PHP_ROUND_HALF_UP); \ @@ -2873,8 +2876,12 @@ PHP_FUNCTION(array_fill_keys) #define RANGE_CHECK_LONG_INIT_ARRAY(start, end, _step) do { \ zend_ulong __calc_size = ((zend_ulong) start - end) / (_step); \ if (__calc_size >= HT_MAX_SIZE - 1) { \ + zend_ulong __excess = __calc_size - (HT_MAX_SIZE - 1); \ zend_value_error(\ - "The supplied range exceeds the maximum array size: start=" ZEND_LONG_FMT " end=" ZEND_LONG_FMT " step=" ZEND_LONG_FMT, end, start, (_step)); \ + "The supplied range exceeds the maximum array size by %lu elements: " \ + "start=" ZEND_LONG_FMT ", end=" ZEND_LONG_FMT ", step=" ZEND_LONG_FMT ". " \ + "Calculated size: %lu, Maximum size: %lu.", \ + __excess, end, start, (_step), __calc_size + 1, HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ size = (uint32_t)(__calc_size + 1); \ From ab93792ca149830fcc6fa13a7297580ef9071491 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Sat, 19 Oct 2024 17:03:59 +0200 Subject: [PATCH 2/8] tests --- ext/standard/tests/array/range/range_bug70239_2.phpt | 4 ++-- ext/standard/tests/array/range/range_bug70239_3.phpt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/tests/array/range/range_bug70239_2.phpt b/ext/standard/tests/array/range/range_bug70239_2.phpt index a4ec3c5563512..33158627f8bcc 100644 --- a/ext/standard/tests/array/range/range_bug70239_2.phpt +++ b/ext/standard/tests/array/range/range_bug70239_2.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- -The supplied range exceeds the maximum array size: start=0 end=%d step=1 +--EXPECT-- +The supplied range exceeds the maximum array size by %d elements: start=0, end=%d, step=1. Calculated size: %d, Maximum size: %d. diff --git a/ext/standard/tests/array/range/range_bug70239_3.phpt b/ext/standard/tests/array/range/range_bug70239_3.phpt index 7099eb1e98cfd..3159bc131cdba 100644 --- a/ext/standard/tests/array/range/range_bug70239_3.phpt +++ b/ext/standard/tests/array/range/range_bug70239_3.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- -The supplied range exceeds the maximum array size: start=-%d end=0 step=1 +--EXPECT-- +The supplied range exceeds the maximum array size by %d elements: start=-%d, end=0, step=1. Calculated size: %d, Maximum size: %d. From 91315754d0e4ccffd05ca8638018cc9fe3314c76 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Sat, 19 Oct 2024 18:25:12 +0200 Subject: [PATCH 3/8] CI --- ext/standard/array.c | 2 +- ext/standard/tests/array/range/range_bug70239_2.phpt | 2 +- ext/standard/tests/array/range/range_bug70239_3.phpt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 36fe9984abaa7..0d0a09cc6fd42 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2881,7 +2881,7 @@ PHP_FUNCTION(array_fill_keys) "The supplied range exceeds the maximum array size by %lu elements: " \ "start=" ZEND_LONG_FMT ", end=" ZEND_LONG_FMT ", step=" ZEND_LONG_FMT ". " \ "Calculated size: %lu, Maximum size: %lu.", \ - __excess, end, start, (_step), __calc_size + 1, HT_MAX_SIZE); \ + __excess, end, start, (_step), __calc_size + 1, (zend_ulong)HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ size = (uint32_t)(__calc_size + 1); \ diff --git a/ext/standard/tests/array/range/range_bug70239_2.phpt b/ext/standard/tests/array/range/range_bug70239_2.phpt index 33158627f8bcc..fc617842b144d 100644 --- a/ext/standard/tests/array/range/range_bug70239_2.phpt +++ b/ext/standard/tests/array/range/range_bug70239_2.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECT-- +--EXPECTF-- The supplied range exceeds the maximum array size by %d elements: start=0, end=%d, step=1. Calculated size: %d, Maximum size: %d. diff --git a/ext/standard/tests/array/range/range_bug70239_3.phpt b/ext/standard/tests/array/range/range_bug70239_3.phpt index 3159bc131cdba..e235894257c16 100644 --- a/ext/standard/tests/array/range/range_bug70239_3.phpt +++ b/ext/standard/tests/array/range/range_bug70239_3.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECT-- +--EXPECTF-- The supplied range exceeds the maximum array size by %d elements: start=-%d, end=0, step=1. Calculated size: %d, Maximum size: %d. From 9df6590e24761e466fe3c615dc83fcbe67b7d145 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Sat, 19 Oct 2024 18:31:35 +0200 Subject: [PATCH 4/8] and somehow i'm blind --- ext/standard/array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 0d0a09cc6fd42..2f7440c65852e 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2880,7 +2880,7 @@ PHP_FUNCTION(array_fill_keys) zend_value_error(\ "The supplied range exceeds the maximum array size by %lu elements: " \ "start=" ZEND_LONG_FMT ", end=" ZEND_LONG_FMT ", step=" ZEND_LONG_FMT ". " \ - "Calculated size: %lu, Maximum size: %lu.", \ + "Calculated size: " ZEND_LONG_FMT ", Maximum size: " ZEND_LONG_FMT ".", \ __excess, end, start, (_step), __calc_size + 1, (zend_ulong)HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ From 77163913ba41aa73ae0d94a7fee585605e0f40e5 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Sat, 19 Oct 2024 19:06:03 +0200 Subject: [PATCH 5/8] asdfgh --- ext/standard/array.c | 8 ++++---- .../range/range_inputs_float_small_step_exhaustion.phpt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 2f7440c65852e..f49640fb29906 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2876,12 +2876,12 @@ PHP_FUNCTION(array_fill_keys) #define RANGE_CHECK_LONG_INIT_ARRAY(start, end, _step) do { \ zend_ulong __calc_size = ((zend_ulong) start - end) / (_step); \ if (__calc_size >= HT_MAX_SIZE - 1) { \ - zend_ulong __excess = __calc_size - (HT_MAX_SIZE - 1); \ + uint64_t __excess = __calc_size - (HT_MAX_SIZE - 1); \ zend_value_error(\ - "The supplied range exceeds the maximum array size by %lu elements: " \ + "The supplied range exceeds the maximum array size by %" PRIu64 " elements: " \ "start=" ZEND_LONG_FMT ", end=" ZEND_LONG_FMT ", step=" ZEND_LONG_FMT ". " \ - "Calculated size: " ZEND_LONG_FMT ", Maximum size: " ZEND_LONG_FMT ".", \ - __excess, end, start, (_step), __calc_size + 1, (zend_ulong)HT_MAX_SIZE); \ + "Calculated size: %" PRIu64 ", Maximum size: %" PRIu64 ".", \ + __excess, end, start, (_step), (uint64_t)__calc_size, (uint64_t)HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ size = (uint32_t)(__calc_size + 1); \ diff --git a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt index b00b3142627cc..010943982def3 100644 --- a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt +++ b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt @@ -14,5 +14,5 @@ try { } ?> --EXPECTF-- -The supplied range exceeds the maximum array size: start=0.0 end=100000000000.0 step=0.1 -The supplied range exceeds the maximum array size: start=-%d end=%d step=1 +The supplied range exceeds the maximum array size by %f elements: start=0.0, end=%f, step=0.1. Max size: %d +The supplied range exceeds the maximum array size by %f elements: start=-%f, end=%f, step=1. Calculated size: %d, Maximum size: %d. From e327e073357d28c5c77364f3abb42e3a83bf0caa Mon Sep 17 00:00:00 2001 From: divinity76 Date: Wed, 23 Oct 2024 17:00:47 +0200 Subject: [PATCH 6/8] Update ext/standard/array.c Co-authored-by: Jakub Zelenka --- ext/standard/array.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index f49640fb29906..73f61d1e45242 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2880,7 +2880,7 @@ PHP_FUNCTION(array_fill_keys) zend_value_error(\ "The supplied range exceeds the maximum array size by %" PRIu64 " elements: " \ "start=" ZEND_LONG_FMT ", end=" ZEND_LONG_FMT ", step=" ZEND_LONG_FMT ". " \ - "Calculated size: %" PRIu64 ", Maximum size: %" PRIu64 ".", \ + "Calculated size: %" PRIu64 ". Maximum size: %" PRIu64 ".", \ __excess, end, start, (_step), (uint64_t)__calc_size, (uint64_t)HT_MAX_SIZE); \ RETURN_THROWS(); \ } \ From 8f9321e1d19d7f7686118a9976c0710545091564 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Wed, 23 Oct 2024 21:30:43 +0200 Subject: [PATCH 7/8] tests --- ext/standard/tests/array/range/range_bug70239_2.phpt | 4 ++-- ext/standard/tests/array/range/range_bug70239_3.phpt | 4 ++-- .../array/range/range_inputs_float_small_step_exhaustion.phpt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/standard/tests/array/range/range_bug70239_2.phpt b/ext/standard/tests/array/range/range_bug70239_2.phpt index fc617842b144d..feb7acb3f8736 100644 --- a/ext/standard/tests/array/range/range_bug70239_2.phpt +++ b/ext/standard/tests/array/range/range_bug70239_2.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- -The supplied range exceeds the maximum array size by %d elements: start=0, end=%d, step=1. Calculated size: %d, Maximum size: %d. +--EXPECT-- +The supplied range exceeds the maximum array size by 9223372035781033984 elements: start=0, end=9223372036854775807, step=1. Calculated size: 9223372036854775807. Maximum size: 1073741824. diff --git a/ext/standard/tests/array/range/range_bug70239_3.phpt b/ext/standard/tests/array/range/range_bug70239_3.phpt index e235894257c16..009633c5186b0 100644 --- a/ext/standard/tests/array/range/range_bug70239_3.phpt +++ b/ext/standard/tests/array/range/range_bug70239_3.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECTF-- -The supplied range exceeds the maximum array size by %d elements: start=-%d, end=0, step=1. Calculated size: %d, Maximum size: %d. +--EXPECT-- +The supplied range exceeds the maximum array size by 9223372035781033985 elements: start=-9223372036854775808, end=0, step=1. Calculated size: 9223372036854775808. Maximum size: 1073741824. diff --git a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt index 010943982def3..447d7819b1f78 100644 --- a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt +++ b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt @@ -15,4 +15,4 @@ try { ?> --EXPECTF-- The supplied range exceeds the maximum array size by %f elements: start=0.0, end=%f, step=0.1. Max size: %d -The supplied range exceeds the maximum array size by %f elements: start=-%f, end=%f, step=1. Calculated size: %d, Maximum size: %d. +The supplied range exceeds the maximum array size by 18446744072635809792 elements: start=-9223372036854775808, end=9223372036854775807, step=1. Calculated size: 18446744073709551615. Maximum size: 1073741824. From 9215c3be51e9e5e970b7d109fc1f6d160aab6269 Mon Sep 17 00:00:00 2001 From: hanshenrik Date: Wed, 23 Oct 2024 23:15:11 +0200 Subject: [PATCH 8/8] rydctfvg --- ext/standard/tests/array/range/range_bug70239_2.phpt | 4 ++-- ext/standard/tests/array/range/range_bug70239_3.phpt | 4 ++-- .../array/range/range_inputs_float_small_step_exhaustion.phpt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/standard/tests/array/range/range_bug70239_2.phpt b/ext/standard/tests/array/range/range_bug70239_2.phpt index feb7acb3f8736..b20f360dba186 100644 --- a/ext/standard/tests/array/range/range_bug70239_2.phpt +++ b/ext/standard/tests/array/range/range_bug70239_2.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECT-- -The supplied range exceeds the maximum array size by 9223372035781033984 elements: start=0, end=9223372036854775807, step=1. Calculated size: 9223372036854775807. Maximum size: 1073741824. +--EXPECTF-- +The supplied range exceeds the maximum array size by %d elements: start=0, end=%d, step=1. Calculated size: %d. Maximum size: %d. diff --git a/ext/standard/tests/array/range/range_bug70239_3.phpt b/ext/standard/tests/array/range/range_bug70239_3.phpt index 009633c5186b0..6307927438df9 100644 --- a/ext/standard/tests/array/range/range_bug70239_3.phpt +++ b/ext/standard/tests/array/range/range_bug70239_3.phpt @@ -8,5 +8,5 @@ try { echo $e->getMessage() . "\n"; } ?> ---EXPECT-- -The supplied range exceeds the maximum array size by 9223372035781033985 elements: start=-9223372036854775808, end=0, step=1. Calculated size: 9223372036854775808. Maximum size: 1073741824. +--EXPECTF-- +The supplied range exceeds the maximum array size by %d elements: start=-%d, end=0, step=1. Calculated size: %d. Maximum size: %d. diff --git a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt index 447d7819b1f78..41ae4ef995bf2 100644 --- a/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt +++ b/ext/standard/tests/array/range/range_inputs_float_small_step_exhaustion.phpt @@ -15,4 +15,4 @@ try { ?> --EXPECTF-- The supplied range exceeds the maximum array size by %f elements: start=0.0, end=%f, step=0.1. Max size: %d -The supplied range exceeds the maximum array size by 18446744072635809792 elements: start=-9223372036854775808, end=9223372036854775807, step=1. Calculated size: 18446744073709551615. Maximum size: 1073741824. +The supplied range exceeds the maximum array size by %d elements: start=-%d, end=%d, step=1. Calculated size: %d. Maximum size: %d.