diff options
author | Joe Watkins <krakjoe@php.net> | 2019-06-19 09:00:00 +0200 |
---|---|---|
committer | Joe Watkins <krakjoe@php.net> | 2019-06-19 09:01:20 +0200 |
commit | fb95043acf19b1f3784c9131a7b77df78bf4acec (patch) | |
tree | 11fddb58412b404ec70e5329e47039c60fd48c7b | |
parent | 5a1ffefbc19cdb6cd7f9b29f620e621295ccb446 (diff) | |
parent | 025899e3b53e47cae9c1da4077988577b57e4b15 (diff) | |
download | php-git-fb95043acf19b1f3784c9131a7b77df78bf4acec.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3:
Resolve discrepencies between second value yielded by gettimeofday and time, fixes #69044
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | ext/date/php_date.c | 34 | ||||
-rw-r--r-- | ext/date/php_date.h | 2 |
3 files changed, 30 insertions, 9 deletions
@@ -7,6 +7,9 @@ PHP NEWS (Nikita) . Fixed bug #78154 (SEND_VAR_NO_REF does not always send reference). (Nikita) +- Date: + . Fixed #69044 (discrepency between time and microtime). (krakjoe) + - Opcache: . Fixed bug #78106 (Path resolution fails if opcache disabled during request). (Nikita) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 3ed320705d..e7c68954bb 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -60,6 +60,22 @@ static inline long long php_date_llabs( long long i ) { return i >= 0 ? i : -i; #endif #endif +PHPAPI time_t php_time() +{ +#ifdef HAVE_GETTIMEOFDAY + struct timeval tm; + + if (UNEXPECTED(gettimeofday(&tm, NULL) != SUCCESS)) { + /* fallback, can't reasonably happen */ + return time(NULL); + } + + return tm.tv_sec; +#else + return time(NULL); +#endif +} + /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO_EX(arginfo_date, 0, 0, 1) ZEND_ARG_INFO(0, format) @@ -1263,7 +1279,7 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); if (ZEND_NUM_ARGS() == 1) { - ts = time(NULL); + ts = php_time(); } RETURN_STR(php_format_date(ZSTR_VAL(format), ZSTR_LEN(format), ts, localtime)); @@ -1428,7 +1444,7 @@ PHP_FUNCTION(idate) } if (ZEND_NUM_ARGS() == 1) { - ts = time(NULL); + ts = php_time(); } ret = php_idate(ZSTR_VAL(format)[0], ts, 0); @@ -1500,7 +1516,7 @@ PHP_FUNCTION(strtotime) now->tz_info = tzi; now->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(now, - (ZEND_NUM_ARGS() == 2) ? (timelib_sll) preset_ts : (timelib_sll) time(NULL)); + (ZEND_NUM_ARGS() == 2) ? (timelib_sll) preset_ts : (timelib_sll) php_time()); t = timelib_strtotime(ZSTR_VAL(times), ZSTR_LEN(times), &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); @@ -1543,12 +1559,12 @@ PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) /* Initialize structure with current time */ now = timelib_time_ctor(); if (gmt) { - timelib_unixtime2gmt(now, (timelib_sll) time(NULL)); + timelib_unixtime2gmt(now, (timelib_sll) php_time()); } else { tzi = get_timezone_info(); now->tz_info = tzi; now->zone_type = TIMELIB_ZONETYPE_ID; - timelib_unixtime2local(now, (timelib_sll) time(NULL)); + timelib_unixtime2local(now, (timelib_sll) php_time()); } /* Fill in the new data */ switch (ZEND_NUM_ARGS()) { @@ -1648,7 +1664,7 @@ PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) timelib_time_offset *offset = NULL; zend_string *buf; - timestamp = (zend_long) time(NULL); + timestamp = (zend_long) php_time(); ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STR(format) @@ -1755,7 +1771,7 @@ PHP_FUNCTION(time) return; } - RETURN_LONG((zend_long)time(NULL)); + RETURN_LONG((zend_long)php_time()); } /* }}} */ @@ -1775,7 +1791,7 @@ PHP_FUNCTION(localtime) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); if (ZEND_NUM_ARGS() == 0) { - timestamp = (zend_long) time(NULL); + timestamp = (zend_long) php_time(); } tzi = get_timezone_info(); @@ -1826,7 +1842,7 @@ PHP_FUNCTION(getdate) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); if (ZEND_NUM_ARGS() == 0) { - timestamp = (zend_long) time(NULL); + timestamp = (zend_long) php_time(); } tzi = get_timezone_info(); diff --git a/ext/date/php_date.h b/ext/date/php_date.h index 8bb6f23ea1..009be83a3f 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -197,6 +197,8 @@ ZEND_END_MODULE_GLOBALS(date) #define DATEG(v) ZEND_MODULE_GLOBALS_ACCESSOR(date, v) +PHPAPI time_t php_time(); + /* Backwards compatibility wrapper */ PHPAPI zend_long php_parse_date(char *string, zend_long *now); PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt); |