From 7a5e5af833218ea6d775c8b5a15f7732c19cf281 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Tue, 22 Jan 2019 11:21:46 -0500
Subject: [PATCH] SystemTools: Revert "Fix FileIsSymlink with Windows data
 deduplication"

This reverts commit ef373416f3 (SystemTools: Fix FileIsSymlink with
Windows data deduplication, 2019-01-18).  It regressed `FileIsSymlink`
such that it does not always recognize broken symlinks as symlinks.

Revert pending further investigation.  Notes for re-introduction:

* We need to add a test to cover the case that broke.
* We should save the Encoding::ToWindowsExtendedPath result and
  use it for both GetFileAttributesW and CreateFileW instead of
  using Encoding::ToWide for the latter.
---
 SystemTools.cxx | 23 +----------------------
 1 file changed, 1 insertion(+), 22 deletions(-)

diff --git a/SystemTools.cxx b/SystemTools.cxx
index e78d95e..c5160a9 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -2982,28 +2982,7 @@ bool SystemTools::FileIsSymlink(const std::string& name)
   DWORD attr =
     GetFileAttributesW(Encoding::ToWindowsExtendedPath(name).c_str());
   if (attr != INVALID_FILE_ATTRIBUTES) {
-    if ((attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
-      HANDLE hFile = CreateFileW(Encoding::ToWide(name).c_str(), GENERIC_READ,
-                                 FILE_SHARE_READ, NULL, OPEN_EXISTING,
-                                 FILE_FLAG_BACKUP_SEMANTICS, NULL);
-      if (hFile == INVALID_HANDLE_VALUE) {
-        return false;
-      }
-      byte buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
-      DWORD bytesReturned = 0;
-      if (!DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, buffer,
-                           MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &bytesReturned,
-                           NULL)) {
-        CloseHandle(hFile);
-        return false;
-      }
-      CloseHandle(hFile);
-      ULONG reparseTag =
-        reinterpret_cast<PREPARSE_GUID_DATA_BUFFER>(&buffer[0])->ReparseTag;
-      return (reparseTag == IO_REPARSE_TAG_SYMLINK) ||
-        (reparseTag == IO_REPARSE_TAG_MOUNT_POINT);
-    }
-    return false;
+    return (attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
   } else {
     return false;
   }
-- 
GitLab