diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 189e4355f5d4..eb211fb0839a 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4331,7 +4331,12 @@ static zval *date_interval_write_property(zval *object, zval *member, zval *valu SET_VALUE_FROM_STRUCT(i, "i"); SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { - obj->diff->us = zval_get_double(value) * 1000000; + double val = zval_get_double(value) * 1000000; + if (val >= 0 && val < 1000000) { + obj->diff->us = val; + } else { + obj->diff->us = -1000000; + } break; } SET_VALUE_FROM_STRUCT(invert, "invert"); diff --git a/ext/date/tests/bug81500.phpt b/ext/date/tests/bug81500.phpt new file mode 100644 index 000000000000..8ae6ba63b4c5 --- /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) +int(-1) +int(1) +int(-1)