From c92e9df4482730043f569d62b3821979cd806918 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 9 Aug 2023 10:19:10 +0100 Subject: [PATCH] Fix GH-11416: Crash with DatePeriod when uninitialised objects are passed in --- ext/date/php_date.c | 6 ++++++ ext/date/tests/bug-gh11416.phpt | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 ext/date/tests/bug-gh11416.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 7b0f223f92fb..fe58eba5c899 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4338,6 +4338,12 @@ PHP_METHOD(DatePeriod, __construct) } dpobj->start_ce = date_ce_date; } else { + /* check initialisation */ + DATE_CHECK_INITIALIZED(Z_PHPDATE_P(start)->time, DateTimeInterface); + if (end) { + DATE_CHECK_INITIALIZED(Z_PHPDATE_P(end)->time, DateTimeInterface); + } + /* init */ php_interval_obj *intobj = Z_PHPINTERVAL_P(interval); diff --git a/ext/date/tests/bug-gh11416.phpt b/ext/date/tests/bug-gh11416.phpt new file mode 100644 index 000000000000..f3746fa6ca6d --- /dev/null +++ b/ext/date/tests/bug-gh11416.phpt @@ -0,0 +1,28 @@ +--TEST-- +Bug GH-11416: Crash with DatePeriod when uninitialised objects are passed in +--INI-- +date.timezone=UTC +--FILE-- +newInstanceWithoutConstructor(); +try { + new DatePeriod($date, new DateInterval('P1D'), 2); +} catch (Error $e) { + echo get_class($e), ': ', $e->getMessage(), "\n"; +} + +$date = (new ReflectionClass(DateTime::class))->newInstanceWithoutConstructor(); +try { + new DatePeriod($now, new DateInterval('P1D'), $date); +} catch (Error $e) { + echo get_class($e), ': ', $e->getMessage(), "\n"; +} + +echo "OK\n"; +?> +--EXPECT-- +Error: The DateTimeInterface object has not been correctly initialized by its constructor +Error: The DateTimeInterface object has not been correctly initialized by its constructor +OK