diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-08-28 16:39:32 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-08-28 16:39:32 +0000 |
commit | 44edb0bd0c56483d6a7c473704d70ab67611d371 (patch) | |
tree | 2954f3ece29d4c576f2dbc6e79c142efb0a8a43e /lib/System/Win32 | |
parent | 885b661e1004978f39cd1d74e586f193dfc0b0a6 (diff) | |
download | external_llvm-44edb0bd0c56483d6a7c473704d70ab67611d371.zip external_llvm-44edb0bd0c56483d6a7c473704d70ab67611d371.tar.gz external_llvm-44edb0bd0c56483d6a7c473704d70ab67611d371.tar.bz2 |
Don't cast Win32 FILETIME structs to int64. Patch by Dimitry Andric!
According to the Microsoft documentation here:
http://msdn.microsoft.com/en-us/library/ms724284%28VS.85%29.aspx
this cast used in lib/System/Win32/Path.inc:
__int64 ft = *reinterpret_cast<__int64*>(&fi.ftLastWriteTime);
should not be done. The documentation says: "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."
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112376 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Win32')
-rw-r--r-- | lib/System/Win32/Path.inc | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index 379527d..42e58a4 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -400,8 +400,10 @@ PathWithStatus::getFileStatus(bool update, std::string *ErrStr) const { for (unsigned i = 0; i < path.length(); ++i) status.uniqueID += path[i]; - __int64 ft = *reinterpret_cast<__int64*>(&fi.ftLastWriteTime); - status.modTime.fromWin32Time(ft); + ULARGE_INTEGER ui; + ui.LowPart = fi.ftLastWriteTime.dwLowDateTime; + ui.HighPart = fi.ftLastWriteTime.dwHighDateTime; + status.modTime.fromWin32Time(ui.QuadPart); status.isDir = fi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; fsIsValid = true; @@ -777,8 +779,11 @@ Path::setStatusInfoOnDisk(const FileStatus &si, std::string *ErrMsg) const { return MakeErrMsg(ErrMsg, path + ": GetFileInformationByHandle: "); } + ULARGE_INTEGER ui; + ui.QuadPart = si.modTime.toWin32Time(); FILETIME ft; - (uint64_t&)ft = si.modTime.toWin32Time(); + ft.dwLowDateTime = ui.LowPart; + ft.dwHighDateTime = ui.HighPart; BOOL ret = SetFileTime(h, NULL, &ft, &ft); DWORD err = GetLastError(); CloseHandle(h); |