Listen to the Windows docs in portability/SysTime.cpp
authorChristopher Dykes <cdykes@fb.com>
Tue, 1 Mar 2016 18:01:25 +0000 (10:01 -0800)
committerFacebook Github Bot 1 <facebook-github-bot-1-bot@fb.com>
Tue, 1 Mar 2016 18:05:37 +0000 (10:05 -0800)
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

index 9969a171440242defa9a3487b4262b3763711dbd..41638e973696fe1d813716bb570ab7c327c8292d 100755 (executable)
@@ -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);
   }