@@ -2522,14 +2522,10 @@ PHPAPI void php_date_initialize_from_ts_long(php_date_obj *dateobj, zend_long se
25222522PHPAPI bool php_date_initialize_from_ts_double (php_date_obj * dateobj , double ts ) /* {{{ */
25232523{
25242524 double sec_dval = trunc (ts );
2525- zend_long sec = (zend_long )sec_dval ;
2526- int usec = (int )(fmod (ts , 1 ) * 1000000 );
2527-
2528- if (UNEXPECTED (isnan (sec_dval )
2529- || sec_dval > (double )TIMELIB_LONG_MAX
2530- || sec_dval < (double )TIMELIB_LONG_MIN
2531- || (sec == TIMELIB_LONG_MIN && usec < 0 )
2532- )) {
2525+ zend_long sec ;
2526+ int usec ;
2527+
2528+ if (UNEXPECTED (isnan (sec_dval ) || !PHP_DATE_DOUBLE_FITS_LONG (sec_dval ))) {
25332529 zend_throw_error (
25342530 date_ce_date_range_error ,
25352531 "Seconds must be a finite number between " TIMELIB_LONG_FMT " and " TIMELIB_LONG_FMT ", %g given" ,
@@ -2540,7 +2536,21 @@ PHPAPI bool php_date_initialize_from_ts_double(php_date_obj *dateobj, double ts)
25402536 return false;
25412537 }
25422538
2539+ sec = (zend_long )sec_dval ;
2540+ usec = (int )(fmod (ts , 1 ) * 1000000 );
2541+
25432542 if (UNEXPECTED (usec < 0 )) {
2543+ if (UNEXPECTED (sec == TIMELIB_LONG_MIN )) {
2544+ zend_throw_error (
2545+ date_ce_date_range_error ,
2546+ "Seconds must be a finite number between " TIMELIB_LONG_FMT " and " TIMELIB_LONG_FMT ", %g given" ,
2547+ TIMELIB_LONG_MIN ,
2548+ TIMELIB_LONG_MAX ,
2549+ sec_dval
2550+ );
2551+ return false;
2552+ }
2553+
25442554 sec = sec - 1 ;
25452555 usec = 1000000 + usec ;
25462556 }
0 commit comments