summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKien Nguyen <kien.n.quang@gmail.com>2022-08-24 23:19:35 +0900
committerEli Zaretskii <eliz@gnu.org>2022-08-25 16:18:58 +0300
commit34e0a232cd0e7b38a33bc9134134c47665aeb185 (patch)
treeb8f621d8237dfb3d0d3421ba4412dd16dbd4c2fb /src
parentb28b2cefaea0d7846ab9a45dc92f68ad00e92085 (diff)
downloademacs-34e0a232cd0e7b38a33bc9134134c47665aeb185.tar.gz
Allow symlink creation on MS-Windows without Administrator privileges
* src/w32.c (symlink): Use the SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE flag when available. (Bug#57386)
Diffstat (limited to 'src')
-rw-r--r--src/w32.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/w32.c b/src/w32.c
index cbcfcdd4f6d..44c279602cf 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -5992,12 +5992,22 @@ sys_umask (int mode)
#ifndef SYMBOLIC_LINK_FLAG_DIRECTORY
#define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1
#endif
+#ifndef SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
+#define SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 0x2
+#endif
int
symlink (char const *filename, char const *linkname)
{
char linkfn[MAX_UTF8_PATH], *tgtfn;
- DWORD flags = 0;
+ /* The SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE flag is
+ supported from Windows 10 build 14972. It is only supported if
+ Developer Mode is enabled, and is ignored if it isn't. */
+ DWORD flags =
+ (os_subtype == OS_SUBTYPE_NT
+ && (w32_major_version > 10
+ || (w32_major_version == 10 && w32_build_number >= 14972)))
+ ? SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE : 0;
int dir_access, filename_ends_in_slash;
/* Diagnostics follows Posix as much as possible. */
@@ -6055,7 +6065,7 @@ symlink (char const *filename, char const *linkname)
directory. */
filename_ends_in_slash = IS_DIRECTORY_SEP (filename[strlen (filename) - 1]);
if (dir_access == 0 || filename_ends_in_slash)
- flags = SYMBOLIC_LINK_FLAG_DIRECTORY;
+ flags |= SYMBOLIC_LINK_FLAG_DIRECTORY;
tgtfn = (char *)map_w32_filename (filename, NULL);
if (filename_ends_in_slash)