diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2017-04-24 17:17:29 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2017-04-24 17:17:29 +0200 |
commit | ffcfbf4b66904529635d0b85687a1be48392ca15 (patch) | |
tree | 428388d662af6d8028d4733ed2dc92c251a43d67 | |
parent | e7bcf4633e569ed0d6d695a71c4fecdfdc6f4b2d (diff) | |
download | cygnal-ffcfbf4b66904529635d0b85687a1be48392ca15.tar.gz cygnal-ffcfbf4b66904529635d0b85687a1be48392ca15.tar.bz2 cygnal-ffcfbf4b66904529635d0b85687a1be48392ca15.zip |
cygwin: try unprivileged symlink creation on W10 1703 and later
Add new SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE flag to
CreateSymbolicLinkW call when running on W10 1703 or later.
Don't do that on older versions to avoid ERROR_INVALID_PARAMETER.
Preliminary, needs testing. There's an off-chance that the
flag results in the same ERROR_INVALID_PARAMETER on 1703 if the
developer settings are not enabled.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/path.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 16de025b6..7d1d23d72 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1621,6 +1621,10 @@ cnt_bs (PWCHAR s, PWCHAR e) return num; } +#ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE +#define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 2 +#endif + static int symlink_native (const char *oldpath, path_conv &win32_newpath) { @@ -1628,6 +1632,7 @@ symlink_native (const char *oldpath, path_conv &win32_newpath) path_conv win32_oldpath; PUNICODE_STRING final_oldpath, final_newpath; UNICODE_STRING final_oldpath_buf; + DWORD flags; if (isabspath (oldpath)) { @@ -1724,9 +1729,11 @@ symlink_native (const char *oldpath, path_conv &win32_newpath) final_oldpath->Buffer[1] = L'\\'; } /* Try to create native symlink. */ + flags = win32_oldpath.isdir () ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0; + if (wincap.has_unprivileged_createsymlink ()) + flags |= SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE; if (!CreateSymbolicLinkW (final_newpath->Buffer, final_oldpath->Buffer, - win32_oldpath.isdir () - ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0)) + flags)) { /* Repair native newpath, we still need it. */ final_newpath->Buffer[1] = L'?'; |