From ad1f7851de7ded56aad94871442a8704b76af94c Mon Sep 17 00:00:00 2001 From: Christopher Dykes Date: Tue, 1 Mar 2016 10:01:25 -0800 Subject: [PATCH] Listen to the Windows docs in portability/SysTime.cpp Summary:As-per the documenation of FILETIME: "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." Reviewed By: yfeldblum Differential Revision: D2989434 fb-gh-sync-id: cf57d569a785e0eb7225b346730bf2ed4c50dc55 shipit-source-id: cf57d569a785e0eb7225b346730bf2ed4c50dc55 --- folly/portability/SysTime.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/folly/portability/SysTime.cpp b/folly/portability/SysTime.cpp index 9969a171..41638e97 100755 --- a/folly/portability/SysTime.cpp +++ b/folly/portability/SysTime.cpp @@ -26,8 +26,13 @@ int gettimeofday(timeval* tv, timezone*) { if (tv) { FILETIME ft; + ULARGE_INTEGER lft; GetSystemTimeAsFileTime(&ft); - uint64_t ns = *(uint64_t*)&ft; + // As per the docs of FILETIME, don't just do an indirect + // pointer cast, to avoid alignment faults. + lft.HighPart = ft.dwHighDateTime; + lft.LowPart = ft.dwLowDateTime; + uint64_t ns = lft.QuadPart; tv->tv_usec = (long)((ns / 10ULL) % 1000000ULL); tv->tv_sec = (long)((ns - posixWinFtOffset) / 10000000ULL); } -- 2.34.1