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
This commit is contained in:
Michael J. Spencer 2010-08-28 16:39:32 +00:00
parent 885b661e10
commit 44edb0bd0c

View File

@ -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);