summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2019-10-28 13:08:06 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2019-10-28 13:08:34 +0100
commit736cd93ef53a458dbe5b86cab1f61721ccbc8b2d (patch)
tree812e47d6264e5b87dcf7cee724a49a7ecd61f258
parentb61b60d15bf17aed3daee79db55399a2643d7a60 (diff)
parent89c327f8848c1a56a61479ee5e7fdd3694d0f867 (diff)
downloadphp-git-736cd93ef53a458dbe5b86cab1f61721ccbc8b2d.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: Fix #78751: Serialising DatePeriod converts DateTimeImmutable
-rw-r--r--NEWS1
-rw-r--r--ext/date/php_date.c12
-rw-r--r--ext/date/tests/bug78751.phpt16
3 files changed, 23 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index c4e0515754..c03d16720c 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ PHP NEWS
- Date:
. Fixed bug #70153 (\DateInterval incorrectly unserialized). (Maksim Iakunin)
+ . Fixed bug #78751 (Serialising DatePeriod converts DateTimeImmutable). (cmb)
- Iconv:
. Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas,
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index 49df94f592..00656a41f9 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -5168,7 +5168,7 @@ static HashTable *date_object_get_properties_period(zval *object) /* {{{ */
if (period_obj->start) {
php_date_obj *date_obj;
- object_init_ex(&zv, date_ce_date);
+ object_init_ex(&zv, period_obj->start_ce);
date_obj = Z_PHPDATE_P(&zv);
date_obj->time = timelib_time_clone(period_obj->start);
} else {
@@ -5178,7 +5178,7 @@ static HashTable *date_object_get_properties_period(zval *object) /* {{{ */
if (period_obj->current) {
php_date_obj *date_obj;
- object_init_ex(&zv, date_ce_date);
+ object_init_ex(&zv, period_obj->start_ce);
date_obj = Z_PHPDATE_P(&zv);
date_obj->time = timelib_time_clone(period_obj->current);
} else {
@@ -5188,7 +5188,7 @@ static HashTable *date_object_get_properties_period(zval *object) /* {{{ */
if (period_obj->end) {
php_date_obj *date_obj;
- object_init_ex(&zv, date_ce_date);
+ object_init_ex(&zv, period_obj->start_ce);
date_obj = Z_PHPDATE_P(&zv);
date_obj->time = timelib_time_clone(period_obj->end);
} else {
@@ -5225,7 +5225,7 @@ static int php_date_period_initialize_from_hash(php_period_obj *period_obj, Hash
ht_entry = zend_hash_str_find(myht, "start", sizeof("start")-1);
if (ht_entry) {
- if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) {
+ if (Z_TYPE_P(ht_entry) == IS_OBJECT && instanceof_function(Z_OBJCE_P(ht_entry), date_ce_interface)) {
php_date_obj *date_obj;
date_obj = Z_PHPDATE_P(ht_entry);
period_obj->start = timelib_time_clone(date_obj->time);
@@ -5239,7 +5239,7 @@ static int php_date_period_initialize_from_hash(php_period_obj *period_obj, Hash
ht_entry = zend_hash_str_find(myht, "end", sizeof("end")-1);
if (ht_entry) {
- if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) {
+ if (Z_TYPE_P(ht_entry) == IS_OBJECT && instanceof_function(Z_OBJCE_P(ht_entry), date_ce_interface)) {
php_date_obj *date_obj;
date_obj = Z_PHPDATE_P(ht_entry);
period_obj->end = timelib_time_clone(date_obj->time);
@@ -5252,7 +5252,7 @@ static int php_date_period_initialize_from_hash(php_period_obj *period_obj, Hash
ht_entry = zend_hash_str_find(myht, "current", sizeof("current")-1);
if (ht_entry) {
- if (Z_TYPE_P(ht_entry) == IS_OBJECT && Z_OBJCE_P(ht_entry) == date_ce_date) {
+ if (Z_TYPE_P(ht_entry) == IS_OBJECT && instanceof_function(Z_OBJCE_P(ht_entry), date_ce_interface)) {
php_date_obj *date_obj;
date_obj = Z_PHPDATE_P(ht_entry);
period_obj->current = timelib_time_clone(date_obj->time);
diff --git a/ext/date/tests/bug78751.phpt b/ext/date/tests/bug78751.phpt
new file mode 100644
index 0000000000..6021b9f6ae
--- /dev/null
+++ b/ext/date/tests/bug78751.phpt
@@ -0,0 +1,16 @@
+--TEST--
+Bug #78751 (Serialising DatePeriod converts DateTimeImmutable)
+--FILE--
+<?php
+$oDay = new DateTimeImmutable('2019-10-25');
+$oDateInterval = DateInterval::createFromDateString('1 day');
+$oDays = new DatePeriod($oDay, $oDateInterval, $oDay->modify('+1 day'));
+$oDays = unserialize(serialize($oDays));
+var_dump(
+ $oDays->start instanceof DateTimeImmutable,
+ $oDays->end instanceof DateTimeImmutable
+);
+?>
+--EXPECT--
+bool(true)
+bool(true)