Forráskód Böngészése

KWSys 2018-08-07 (9044518f)

Code extracted from:

    https://gitlab.kitware.com/utils/kwsys.git

at commit 9044518f428b84da70f1e02d09b7cd4c35366831 (master).

Upstream Shortlog
-----------------

Jon Chronopoulos (1):
      55a29eba SystemTools: Allow FileExists on Windows to follow symlinks
KWSys Upstream 7 éve
szülő
commit
4d76239a51
1 módosított fájl, 21 hozzáadás és 3 törlés
  1. 21 3
      SystemTools.cxx

+ 21 - 3
SystemTools.cxx

@@ -1197,9 +1197,27 @@ bool SystemTools::FileExists(const std::string& filename)
   }
   }
   return access(filename.c_str(), R_OK) == 0;
   return access(filename.c_str(), R_OK) == 0;
 #elif defined(_WIN32)
 #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
 #else
 // SCO OpenServer 5.0.7/3.2's command has 711 permission.
 // SCO OpenServer 5.0.7/3.2's command has 711 permission.
 #  if defined(_SCO_DS)
 #  if defined(_SCO_DS)