diff --git a/NEWS b/NEWS index 3b9ad03e11e..bc468c50c77 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #81518 (Header injection via default_mimetype / default_charset). (cmb) +- Date: + . Fixed bug #81500 (Interval serialization regression since 7.3.14 / 7.4.2). + (cmb) + 14 Oct 2021, PHP 8.1.0RC4 - CLI: diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e2943e6f708..cf4a11b8a22 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3850,7 +3850,7 @@ static zval *date_interval_write_property(zend_object *object, zend_string *name SET_VALUE_FROM_STRUCT(i, "i"); SET_VALUE_FROM_STRUCT(s, "s"); if (zend_string_equals_literal(name, "f")) { - obj->diff->us = zval_get_double(value) * 1000000; + obj->diff->us = zend_dval_to_lval(zval_get_double(value) * 1000000.0); break; } SET_VALUE_FROM_STRUCT(invert, "invert"); @@ -3968,12 +3968,8 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter PHP_DATE_INTERVAL_READ_PROPERTY("s", s, timelib_sll, -1) { zval *z_arg = zend_hash_str_find(myht, "f", sizeof("f") - 1); - (*intobj)->diff->us = -1000000; if (z_arg) { - double val = zval_get_double(z_arg) * 1000000; - if (val >= 0 && val < 1000000) { - (*intobj)->diff->us = val; - } + (*intobj)->diff->us = zend_dval_to_lval(zval_get_double(z_arg) * 1000000.0); } } PHP_DATE_INTERVAL_READ_PROPERTY("weekday", weekday, int, -1) diff --git a/ext/date/tests/bug53437_var3.phpt b/ext/date/tests/bug53437_var3.phpt index 44e6a80c89e..eb043398e2d 100644 --- a/ext/date/tests/bug53437_var3.phpt +++ b/ext/date/tests/bug53437_var3.phpt @@ -43,5 +43,5 @@ object(DateInterval)#%d (16) { ["have_special_relative"]=> int(0) ["f"]=> - float(-1) + float(0) } diff --git a/ext/date/tests/bug53437_var5.phpt b/ext/date/tests/bug53437_var5.phpt index baffbb484ad..55bba9ed59d 100644 --- a/ext/date/tests/bug53437_var5.phpt +++ b/ext/date/tests/bug53437_var5.phpt @@ -43,5 +43,5 @@ object(DateInterval)#%d (16) { ["have_special_relative"]=> int(0) ["f"]=> - float(-1) + float(0) } diff --git a/ext/date/tests/bug73091.phpt b/ext/date/tests/bug73091.phpt index 14f161afe74..918170d823f 100644 --- a/ext/date/tests/bug73091.phpt +++ b/ext/date/tests/bug73091.phpt @@ -28,7 +28,7 @@ object(DateInterval)#%d (16) { ["s"]=> int(-1) ["f"]=> - float(-1) + float(0) ["weekday"]=> int(-1) ["weekday_behavior"]=> diff --git a/ext/date/tests/bug79015.phpt b/ext/date/tests/bug79015.phpt index 5ebb13832b7..9d752dee722 100644 --- a/ext/date/tests/bug79015.phpt +++ b/ext/date/tests/bug79015.phpt @@ -20,7 +20,7 @@ object(DateInterval)#%d (16) { ["s"]=> int(0) ["f"]=> - float(-1) + float(%f) ["weekday"]=> int(0) ["weekday_behavior"]=> diff --git a/ext/date/tests/bug81500.phpt b/ext/date/tests/bug81500.phpt new file mode 100644 index 00000000000..0c60c204a34 --- /dev/null +++ b/ext/date/tests/bug81500.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #81500 (Interval serialization regression since 7.3.14 / 7.4.2) +--FILE-- +f = -0.000001; +var_dump($interval->s, $interval->f); + +$interval = unserialize(serialize($interval)); +var_dump($interval->s, $interval->f); +?> +--EXPECT-- +int(1) +float(-1.0E-6) +int(1) +float(-1.0E-6) diff --git a/ext/standard/tests/serialize/bug69425.phpt b/ext/standard/tests/serialize/bug69425.phpt index e080fda7dd5..906c7192fb2 100644 --- a/ext/standard/tests/serialize/bug69425.phpt +++ b/ext/standard/tests/serialize/bug69425.phpt @@ -40,7 +40,7 @@ array(2) { ["s"]=> int(-1) ["f"]=> - float(-1) + float(0) ["weekday"]=> int(-1) ["weekday_behavior"]=>