diff options
author | Brad King <brad.king@kitware.com> | 2018-08-07 11:16:09 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2018-08-07 11:16:09 (GMT) |
commit | ba872ea9c372b207d4fadaea7edc235c212e9a85 (patch) | |
tree | 447c887fa0baa11f063729fe454dc5299f5cfd52 /Source/kwsys/SystemTools.cxx | |
parent | 6038f0730a8b043328ad80ed2fdea66604bc6509 (diff) | |
parent | 4d76239a5107c0eb63486d948ae862784cfc6f9b (diff) | |
download | CMake-ba872ea9c372b207d4fadaea7edc235c212e9a85.zip CMake-ba872ea9c372b207d4fadaea7edc235c212e9a85.tar.gz CMake-ba872ea9c372b207d4fadaea7edc235c212e9a85.tar.bz2 |
Merge branch 'upstream-KWSys' into update-kwsys
* upstream-KWSys:
KWSys 2018-08-07 (9044518f)
Diffstat (limited to 'Source/kwsys/SystemTools.cxx')
-rw-r--r-- | Source/kwsys/SystemTools.cxx | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index d552d9f..476fe08 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -1197,9 +1197,27 @@ bool SystemTools::FileExists(const std::string& filename) } return access(filename.c_str(), R_OK) == 0; #elif defined(_WIN32) - return ( - GetFileAttributesW(Encoding::ToWindowsExtendedPath(filename).c_str()) != - INVALID_FILE_ATTRIBUTES); + DWORD attr = + GetFileAttributesW(Encoding::ToWindowsExtendedPath(filename).c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) { + return false; + } + + if (attr & FILE_ATTRIBUTE_REPARSE_POINT) { + // Using 0 instead of GENERIC_READ as it allows reading of file attributes + // even if we do not have permission to read the file itself + HANDLE handle = + CreateFileW(Encoding::ToWindowsExtendedPath(filename).c_str(), 0, 0, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + + if (handle == INVALID_HANDLE_VALUE) { + return false; + } + + CloseHandle(handle); + } + + return true; #else // SCO OpenServer 5.0.7/3.2's command has 711 permission. # if defined(_SCO_DS) |