Skip to content

Commit 26d3153

Browse files
committed
Added PHP_DATE_SIZEOF_LONG/PHP_DATE_DOUBLE_FITS_LONG similar to SIZEOF_ZEND_LONG/ZEND_DOUBLE_FITS_LONG
1 parent fbb156d commit 26d3153

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

ext/date/php_date.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2522,14 +2522,10 @@ PHPAPI void php_date_initialize_from_ts_long(php_date_obj *dateobj, zend_long se
25222522
PHPAPI 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
}

ext/date/php_date.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@
2020
#include "lib/timelib.h"
2121
#include "Zend/zend_hash.h"
2222

23+
/* Same as SIZEOF_ZEND_LONG but using TIMELIB_LONG_MAX/MIN */
24+
#if TIMELIB_LONG_MAX == 2147483647
25+
# define PHP_DATE_SIZEOF_LONG 4
26+
#elif TIMELIB_LONG_MAX == 9223372036854775807
27+
# define PHP_DATE_SIZEOF_LONG 8
28+
#else
29+
# error "Unknown TIMELIB LONG SIZE"
30+
#endif
31+
32+
/* Same as ZEND_DOUBLE_FITS_LONG but using TIMELIB_LONG_MAX/MIN */
33+
#if PHP_DATE_SIZEOF_LONG == 4
34+
# define PHP_DATE_DOUBLE_FITS_LONG(d) (!((d) > (double)TIMELIB_LONG_MAX || (d) < (double)TIMELIB_LONG_MIN))
35+
#elif PHP_DATE_SIZEOF_LONG == 8
36+
/* >= as (double)TIMELIB_LONG_MAX is outside signed range */
37+
# define PHP_DATE_DOUBLE_FITS_LONG(d) (!((d) >= (double)TIMELIB_LONG_MAX || (d) < (double)TIMELIB_LONG_MIN))
38+
#endif
39+
2340
#include "php_version.h"
2441
#define PHP_DATE_VERSION PHP_VERSION
2542

0 commit comments

Comments
 (0)