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