From c86b8ba4cbf8ffb2a02ecb4582c09bf62214eade Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 17 Oct 2024 17:05:20 +0200 Subject: [PATCH 1/3] Fix GH-16454: Unhandled INF in date_sunset() with tiny $utcOffset After normalization, `N` is supposed to be in range [0, 24], but for very large and very small `$utcOffset` this is not necessarily the case, since the normalization might yied `-inf` or `inf`. If that happens, we let the function fail silently, since it is highly unlikely that such `$utcOffset`s are passed in practice. --- ext/date/php_date.c | 3 +++ ext/date/tests/gh16454.phpt | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 ext/date/tests/gh16454.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index dc9eb995b8f65..1f49a7f0e0bf4 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -5140,6 +5140,9 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, bool calc_s if (N > 24 || N < 0) { N -= floor(N / 24) * 24; } + if (N > 24 || N < 0) { + RETURN_FALSE; + } switch (retformat) { case SUNFUNCS_RET_STRING: diff --git a/ext/date/tests/gh16454.phpt b/ext/date/tests/gh16454.phpt new file mode 100644 index 0000000000000..e3a35a1ba1998 --- /dev/null +++ b/ext/date/tests/gh16454.phpt @@ -0,0 +1,29 @@ +--TEST-- +GH-16454 (Unhandled INF in date_sunset() with tiny $utcOffset) +--FILE-- + +--EXPECTF-- +Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d + +Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +bool(false) + +Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d + +Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +bool(false) + +Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d + +Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +bool(false) + +Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d + +Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +bool(false) From f1463a5f8ed4e335561c5822cb524104dfb4c237 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 17 Oct 2024 17:41:44 +0200 Subject: [PATCH 2/3] SUNFUNCS_RET_STRING is only deprecated as of PHP 8.4.0 --- ext/date/tests/gh16454.phpt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/ext/date/tests/gh16454.phpt b/ext/date/tests/gh16454.phpt index e3a35a1ba1998..c2603216bd2c5 100644 --- a/ext/date/tests/gh16454.phpt +++ b/ext/date/tests/gh16454.phpt @@ -8,22 +8,14 @@ var_dump(date_sunset(0, SUNFUNCS_RET_STRING, 61, -150, 90, PHP_FLOAT_MAX)); var_dump(date_sunset(0, SUNFUNCS_RET_STRING, 61, -150, 90, -PHP_FLOAT_MAX)); ?> --EXPECTF-- -Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d - Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d bool(false) -Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d - Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d bool(false) -Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d - Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d bool(false) -Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d - Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d bool(false) From 1884caa31ce8a3b35c7d59bd5f6b0b0d6018fda0 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 17 Oct 2024 18:14:14 +0200 Subject: [PATCH 3/3] error message changed as of PHP 8.4.0 --- ext/date/tests/gh16454.phpt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/date/tests/gh16454.phpt b/ext/date/tests/gh16454.phpt index c2603216bd2c5..3d57276ddf5d3 100644 --- a/ext/date/tests/gh16454.phpt +++ b/ext/date/tests/gh16454.phpt @@ -8,14 +8,14 @@ var_dump(date_sunset(0, SUNFUNCS_RET_STRING, 61, -150, 90, PHP_FLOAT_MAX)); var_dump(date_sunset(0, SUNFUNCS_RET_STRING, 61, -150, 90, -PHP_FLOAT_MAX)); ?> --EXPECTF-- -Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +Deprecated: Function date_sunrise() is deprecated in %s on line %d bool(false) -Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +Deprecated: Function date_sunrise() is deprecated in %s on line %d bool(false) -Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +Deprecated: Function date_sunset() is deprecated in %s on line %d bool(false) -Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d +Deprecated: Function date_sunset() is deprecated in %s on line %d bool(false)