com php-src: Fixed bug #73837 ("new DateTime()" sometimes returns 1 second ago value).: NEWS ext/date/php_date.c

[email protected] (Derick Rethans)
Newsgroups php.cvs
Message-ID <[email protected]>
Commit:    5113909259f897c9c69f23cf5f8f7ab8972d5eba
Author:    Derick Rethans <[email protected]>         Sat, 11 Feb 2017 11:10:01 +0000
Parents:   808a11041d496ba86d319bb706a711d6b2489942
Branches:  PHP-7.1 master

Link:       http://git.php.net/?p=php-src.git;a=commitdiff;h=5113909259f897c9c69f23cf5f8f7ab8972d5eba

Log:
Fixed bug #73837 ("new DateTime()" sometimes returns 1 second ago value).

Bugs:
https://bugs.php.net/73837

Changed paths:
  M  NEWS
  M  ext/date/php_date.c


Diff:
diff --git a/NEWS b/NEWS
index 299f4e8..302da8d 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,10 @@ PHP                                                                        NEWS
   . Fixed bug #61471 (Incomplete POST does not timeout but is passed to PHP).
     (Zheng Shao)
 
+- Date:
+  . Fixed bug #73837 ("new DateTime()" sometimes returns 1 second ago value).
+    (Derick)
+
 - GD:
   . Fixed bug #74031 (ReflectionFunction for imagepng is missing last two
     parameters). (finwe)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index fe1cbe2..6bc1803 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -2549,15 +2549,17 @@ static void php_date_set_time_fraction(timelib_time *time, int microseconds)
 	time->f = microseconds / 1000000;
 }
 
-static void php_date_set_current_time_fraction(timelib_time *time)
+static void php_date_get_current_time_with_fraction(time_t *sec, suseconds_t *usec)
 {
 #if HAVE_GETTIMEOFDAY
 	struct timeval tp = {0}; /* For setting microseconds */
 
 	gettimeofday(&tp, NULL);
-	timelib_set_fraction_from_timeval(time, tp);
+	*sec = tp.tv_sec;
+	*usec = tp.tv_usec;
 #else
-	time->f = 0;
+	*sec = time(NULL);
+	*usec = 0;
 #endif
 }
 
@@ -2569,6 +2571,8 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
 	int type = TIMELIB_ZONETYPE_ID, new_dst = 0;
 	char *new_abbr = NULL;
 	timelib_sll new_offset = 0;
+	time_t sec;
+	suseconds_t usec;
 
 	if (dateobj->time) {
 		timelib_time_dtor(dateobj->time);
@@ -2633,8 +2637,9 @@ PHPAPI int php_date_initialize(php_date_obj *dateobj, /*const*/ char *time_str,
 			now->tz_abbr = new_abbr;
 			break;
 	}
-	timelib_unixtime2local(now, (timelib_sll) time(NULL));
-	php_date_set_current_time_fraction(now);
+	php_date_get_current_time_with_fraction(&sec, &usec);
+	timelib_unixtime2local(now, (timelib_sll) sec);
+	php_date_set_time_fraction(now, usec);
 	timelib_fill_holes(dateobj->time, now, TIMELIB_NO_CLONE);
 	timelib_update_ts(dateobj->time, tzi);
 	timelib_update_from_sse(dateobj->time);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.