mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 10:50:16 -06:00
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
This commit is contained in:
committed by
Brad King
parent
82b8bd4ef9
commit
5101d586c4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user