summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2013-03-23 17:48:05 +0100
committerAnatol Belski <ab@php.net>2013-03-23 17:48:05 +0100
commit2e00f7611c29713b7b53ee9006892fc9576fb788 (patch)
tree8127adac64b30c3c9027335011d235ef6a411005 /win32
parentdefb08c705ac40ed9c77a57c98ebe2d856a45e07 (diff)
parent3654ff73660a6b8fbf2a696effe844bb9485ff17 (diff)
downloadphp-git-2e00f7611c29713b7b53ee9006892fc9576fb788.tar.gz
Merge branch 'PHP-5.4' into PHP-5.5
* PHP-5.4: Fixed possible precision loss in microtime
Diffstat (limited to 'win32')
-rw-r--r--win32/time.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/win32/time.c b/win32/time.c
index 77e4504cd1..75539748e8 100644
--- a/win32/time.c
+++ b/win32/time.c
@@ -50,6 +50,7 @@ int getfilesystemtime(struct timeval *tv)
FILETIME ft;
unsigned __int64 ff = 0;
MyGetSystemTimeAsFileTime timefunc;
+ ULARGE_INTEGER fft;
timefunc = get_time_func();
if (timefunc) {
@@ -58,14 +59,20 @@ int getfilesystemtime(struct timeval *tv)
GetSystemTimeAsFileTime(&ft);
}
- ff |= ft.dwHighDateTime;
- ff <<= 32;
- ff |= ft.dwLowDateTime;
- ff /= 10; /* convert to microseconds */
+ /*
+ * Do not cast a pointer to a FILETIME structure to either a
+ * ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.
+ * via http://technet.microsoft.com/en-us/library/ms724284(v=vs.85).aspx
+ */
+ fft.HighPart = ft.dwHighDateTime;
+ fft.LowPart = ft.dwLowDateTime;
+ ff = fft.QuadPart;
+
+ ff /= 10Ui64; /* convert to microseconds */
ff -= 11644473600000000Ui64; /* convert to unix epoch */
- tv->tv_sec = (long)(ff / 1000000UL);
- tv->tv_usec = (long)(ff % 1000000UL);
+ tv->tv_sec = (long)(ff / 1000000Ui64);
+ tv->tv_usec = (long)(ff % 1000000Ui64);
return 0;
}