Jelajahi Sumber

Windows: Prefer junctions for directory symlinks

Update the approach added by commit afb7f6e4ff (cmake: Add '-E
create_symlink' support on Windows, 2018-06-11, v3.13.0-rc1~75^2) to use
junctions, as suggested [here](https://superuser.com/a/1291446/140450).
This allows them to work under security limitations on Windows.

Fixes: #23257
Sergei Kryvonos 3 tahun lalu
induk
melakukan
5101d586c4
1 mengubah file dengan 12 tambahan dan 2 penghapusan
  1. 12 2
      Source/cmSystemTools.cxx

+ 12 - 2
Source/cmSystemTools.cxx

@@ -3314,12 +3314,22 @@ cmsys::Status cmSystemTools::CreateSymlink(std::string const& origName,
   uv_fs_t req;
   int flags = 0;
 #if defined(_WIN32)
-  if (cmsys::SystemTools::FileIsDirectory(origName)) {
-    flags |= UV_FS_SYMLINK_DIR;
+  bool const isDir = cmsys::SystemTools::FileIsDirectory(origName);
+  if (isDir) {
+    flags |= UV_FS_SYMLINK_JUNCTION;
   }
 #endif
   int err = uv_fs_symlink(nullptr, &req, origName.c_str(), newName.c_str(),
                           flags, nullptr);
+#if defined(_WIN32)
+  if (err && uv_fs_get_system_error(&req) == ERROR_NOT_SUPPORTED && isDir) {
+    // Try fallback to symlink for network (requires additional permissions).
+    flags ^= UV_FS_SYMLINK_JUNCTION | UV_FS_SYMLINK_DIR;
+    err = uv_fs_symlink(nullptr, &req, origName.c_str(), newName.c_str(),
+                        flags, nullptr);
+  }
+#endif
+
   cmsys::Status status;
   if (err) {
 #if defined(_WIN32)