Skip to content

Commit 362c96e

Browse files
committed
Fixed GH-8471: Segmentation fault when converting immutable and mutable DateTime instances created using reflection
1 parent 710294c commit 362c96e

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

ext/date/php_date.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2468,8 +2468,10 @@ PHP_METHOD(DateTime, createFromImmutable)
24682468
Z_PARAM_OBJECT_OF_CLASS(datetimeimmutable_object, date_ce_immutable)
24692469
ZEND_PARSE_PARAMETERS_END();
24702470

2471-
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
24722471
old_obj = Z_PHPDATE_P(datetimeimmutable_object);
2472+
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
2473+
2474+
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
24732475
new_obj = Z_PHPDATE_P(return_value);
24742476

24752477
new_obj->time = timelib_time_clone(old_obj->time);
@@ -2487,8 +2489,10 @@ PHP_METHOD(DateTime, createFromInterface)
24872489
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
24882490
ZEND_PARSE_PARAMETERS_END();
24892491

2490-
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
24912492
old_obj = Z_PHPDATE_P(datetimeinterface_object);
2493+
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
2494+
2495+
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_date, return_value);
24922496
new_obj = Z_PHPDATE_P(return_value);
24932497

24942498
new_obj->time = timelib_time_clone(old_obj->time);
@@ -2506,8 +2510,10 @@ PHP_METHOD(DateTimeImmutable, createFromMutable)
25062510
Z_PARAM_OBJECT_OF_CLASS(datetime_object, date_ce_date)
25072511
ZEND_PARSE_PARAMETERS_END();
25082512

2509-
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
25102513
old_obj = Z_PHPDATE_P(datetime_object);
2514+
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
2515+
2516+
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
25112517
new_obj = Z_PHPDATE_P(return_value);
25122518

25132519
new_obj->time = timelib_time_clone(old_obj->time);
@@ -2525,8 +2531,10 @@ PHP_METHOD(DateTimeImmutable, createFromInterface)
25252531
Z_PARAM_OBJECT_OF_CLASS(datetimeinterface_object, date_ce_interface)
25262532
ZEND_PARSE_PARAMETERS_END();
25272533

2528-
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
25292534
old_obj = Z_PHPDATE_P(datetimeinterface_object);
2535+
DATE_CHECK_INITIALIZED(old_obj->time, DateTime);
2536+
2537+
php_date_instantiate(execute_data->This.value.ce ? execute_data->This.value.ce : date_ce_immutable, return_value);
25302538
new_obj = Z_PHPDATE_P(return_value);
25312539

25322540
new_obj->time = timelib_time_clone(old_obj->time);

0 commit comments

Comments
 (0)