summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2017-04-24 17:17:29 +0200
committerCorinna Vinschen <corinna@vinschen.de>2017-04-24 17:17:29 +0200
commitffcfbf4b66904529635d0b85687a1be48392ca15 (patch)
tree428388d662af6d8028d4733ed2dc92c251a43d67
parente7bcf4633e569ed0d6d695a71c4fecdfdc6f4b2d (diff)
downloadcygnal-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.cc11
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'?';