From 684ddd305d0f599e4009a6d230e6def723885257 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 5 May 2022 12:15:44 +0100 Subject: [PATCH] GH-8458: DateInterval::createFromDateString does not throw non-relative items are present --- NEWS | 4 +++ ext/date/php_date.c | 6 ++++ .../tests/DateInterval_serialize-003.phpt | 16 ++++----- .../date_interval_non_relative_warning.phpt | 36 +++++++++++++++++++ 4 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 ext/date/tests/date_interval_non_relative_warning.phpt diff --git a/NEWS b/NEWS index 713620b284536..264f8c4b8570f 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,10 @@ PHP NEWS - Curl: . Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier) +- Date: + . Fixed GH-8458 (DateInterval::createFromDateString does not throw if + non-relative items are present). (Derick) + - FPM: . Emit error for invalid port setting. (David Carlier) . Added extra check for FPM proc dumpable on SELinux based systems. diff --git a/ext/date/php_date.c b/ext/date/php_date.c index d00c073ccee6c..c3fe8f90e4769 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4333,6 +4333,12 @@ PHP_FUNCTION(date_interval_create_from_date_string) goto cleanup; } + if (time->have_date || time->have_time || time->have_zone) { + php_error_docref(NULL, E_WARNING, "String '%s' contains non-relative elements", ZSTR_VAL(time_str)); + RETVAL_FALSE; + goto cleanup; + } + php_date_instantiate(date_ce_interval, return_value); diobj = Z_PHPINTERVAL_P(return_value); diobj->diff = timelib_rel_time_clone(&time->relative); diff --git a/ext/date/tests/DateInterval_serialize-003.phpt b/ext/date/tests/DateInterval_serialize-003.phpt index e8915ee515d25..b338a9ae93adb 100644 --- a/ext/date/tests/DateInterval_serialize-003.phpt +++ b/ext/date/tests/DateInterval_serialize-003.phpt @@ -4,9 +4,7 @@ Test DateInterval::__serialize and DateInterval::__unserialize __unserialize( [ 'from_string' => true, - 'date_string' => 'next weekday 15:30', + 'date_string' => 'next weekday', ] ); var_dump($d); @@ -42,12 +40,12 @@ object(DateInterval)#1 (%d) { ["from_string"]=> bool(true) ["date_string"]=> - string(18) "next weekday 15:30" + string(%d) "next weekday" } Serialised object: -string(92) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:18:"next weekday 15:30";}" +string(%d) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:%d:"next weekday";}" Unserialised object: @@ -55,7 +53,7 @@ object(DateInterval)#2 (2) { ["from_string"]=> bool(true) ["date_string"]=> - string(18) "next weekday 15:30" + string(%d) "next weekday" } @@ -64,7 +62,7 @@ array(2) { ["from_string"]=> bool(true) ["date_string"]=> - string(18) "next weekday 15:30" + string(%d) "next weekday" } @@ -73,7 +71,7 @@ object(DateInterval)#3 (2) { ["from_string"]=> bool(true) ["date_string"]=> - string(18) "next weekday 15:30" + string(%d) "next weekday" } diff --git a/ext/date/tests/date_interval_non_relative_warning.phpt b/ext/date/tests/date_interval_non_relative_warning.phpt new file mode 100644 index 0000000000000..fc0b246277940 --- /dev/null +++ b/ext/date/tests/date_interval_non_relative_warning.phpt @@ -0,0 +1,36 @@ +--TEST-- +GH-8458 (DateInterval::createFromDateString does not warn when non-relative items are present) +--FILE-- + +--EXPECTF-- +Warning: DateInterval::createFromDateString(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: DateInterval::createFromDateString(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: DateInterval::createFromDateString(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: DateInterval::createFromDateString(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: date_interval_create_from_date_string(): String 'next weekday 15:30' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: date_interval_create_from_date_string(): String '+5 hours noon' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: date_interval_create_from_date_string(): String '-8 days March 23' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d + +Warning: date_interval_create_from_date_string(): String '+72 seconds UTC' contains non-relative elements in %sdate_interval_non_relative_warning.php on line %d