From 186c17f4542efb2be15a61138677418c672506a8 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Fri, 12 Mar 2021 21:53:58 -0600 Subject: [PATCH] ntdll-Junction_Points: Updates from Erich E. Hoover. --- ...upport-for-absolute-symlink-creation.patch | 22 ++++++++------- ...-ntdll-Add-support-for-file-symlinks.patch | 27 +++++++++---------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch b/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch index 41934567..5da94266 100644 --- a/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch +++ b/patches/ntdll-Junction_Points/0007-ntdll-Add-support-for-absolute-symlink-creation.patch @@ -1,4 +1,4 @@ -From 7e61f5b75c7bebded9476d271e5a1377a63938b1 Mon Sep 17 00:00:00 2001 +From 7fd3c661bce1c490fe9e2ad04b524777e897b896 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:06:24 -0700 Subject: [PATCH] ntdll: Add support for absolute symlink creation. @@ -6,9 +6,9 @@ Subject: [PATCH] ntdll: Add support for absolute symlink creation. Signed-off-by: Erich E. Hoover --- dlls/ntdll/tests/file.c | 117 ++++++++++++++++++++++++++++++++++------ - dlls/ntdll/unix/file.c | 33 ++++++++++-- + dlls/ntdll/unix/file.c | 37 +++++++++++-- include/ntifs.h | 10 ++++ - 3 files changed, 141 insertions(+), 19 deletions(-) + 3 files changed, 145 insertions(+), 19 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 5882793c883..53a24574eec 100644 @@ -193,7 +193,7 @@ index 5882793c883..53a24574eec 100644 } diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index 982df84d029..11a7269c09e 100644 +index 773223acd7c..9e4d00deb0e 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -5845,18 +5845,34 @@ static void ignore_server_ioctl_struct_holes( ULONG code, const void *in_buffer, @@ -234,16 +234,20 @@ index 982df84d029..11a7269c09e 100644 if ((status = server_get_unix_fd( handle, FILE_SPECIAL_ACCESS, &dest_fd, &needs_close, NULL, NULL ))) return status; -@@ -5891,6 +5907,16 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5891,6 +5907,20 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) strcat( magic_dest, "." ); strcat( magic_dest, "/" ); } + /* Encode the type (file or directory) if NT symlink */ + if (buffer->ReparseTag == IO_REPARSE_TAG_SYMLINK) + { -+ BOOL is_dir = FALSE; /* treat dangling symlinks as files */ -+ if (!stat( unix_dest, &st )) -+ is_dir = S_ISDIR(st.st_mode); ++ BOOL is_dir; ++ if (fstat( dest_fd, &st ) == -1) ++ { ++ status = errno_to_status( errno ); ++ goto cleanup; ++ } ++ is_dir = S_ISDIR(st.st_mode); + if (is_dir) + strcat( magic_dest, "." ); + strcat( magic_dest, "/" ); @@ -251,7 +255,7 @@ index 982df84d029..11a7269c09e 100644 strcat( magic_dest, unix_dest ); /* Produce the link in a temporary location in the same folder */ -@@ -6254,6 +6280,7 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap +@@ -6254,6 +6284,7 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap switch(buffer->ReparseTag) { case IO_REPARSE_TAG_MOUNT_POINT: diff --git a/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch b/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch index a28b5567..87bf9953 100644 --- a/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch +++ b/patches/ntdll-Junction_Points/0012-ntdll-Add-support-for-file-symlinks.patch @@ -1,4 +1,4 @@ -From 9dd02015d50ecfdf378fe5cced2697f50eb56794 Mon Sep 17 00:00:00 2001 +From 4a1aecb1e9b29fbe0f8d2f4e7d7410af0bbc060e Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 11 Apr 2019 17:57:53 -0600 Subject: [PATCH] ntdll: Add support for file symlinks. @@ -6,8 +6,8 @@ Subject: [PATCH] ntdll: Add support for file symlinks. Signed-off-by: Erich E. Hoover --- dlls/ntdll/tests/file.c | 29 +++++++++++++++++++++++++++++ - dlls/ntdll/unix/file.c | 26 +++++++++++++++++++++----- - 2 files changed, 50 insertions(+), 5 deletions(-) + dlls/ntdll/unix/file.c | 25 ++++++++++++++++++++----- + 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index bdc1a151b45..8938c5bf50c 100644 @@ -50,7 +50,7 @@ index bdc1a151b45..8938c5bf50c 100644 ok(bret, "Failed to create junction point directory.\n"); dwret = GetFileAttributesW(reparse_path); diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index 522cc38f2fc..0655371dc66 100644 +index 0d064d98743..9b8458b413c 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -5854,6 +5854,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) @@ -61,16 +61,15 @@ index 522cc38f2fc..0655371dc66 100644 NTSTATUS status; struct stat st; WCHAR *dest; -@@ -5986,7 +5987,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5986,7 +5987,6 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) /* Encode the type (file or directory) if NT symlink */ if (buffer->ReparseTag == IO_REPARSE_TAG_SYMLINK) { -- BOOL is_dir = FALSE; /* treat dangling symlinks as files */ -+ is_dir = FALSE; /* treat dangling symlinks as files */ - if (!stat( unix_dest, &st )) - is_dir = S_ISDIR(st.st_mode); - if (is_dir) -@@ -6016,8 +6017,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +- BOOL is_dir; + if (fstat( dest_fd, &st ) == -1) + { + status = errno_to_status( errno ); +@@ -6020,8 +6020,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) /* Atomically move the link into position */ if (!renameat2( -1, tmplink, -1, unix_src, RENAME_EXCHANGE )) { @@ -84,7 +83,7 @@ index 522cc38f2fc..0655371dc66 100644 } else if (errno == ENOSYS) { -@@ -6225,6 +6229,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +@@ -6229,6 +6232,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) char tmpdir[PATH_MAX], tmpfile[PATH_MAX], *d; BOOL tempdir_created = FALSE; int dest_fd, needs_close; @@ -92,7 +91,7 @@ index 522cc38f2fc..0655371dc66 100644 NTSTATUS status; char *unix_name; struct stat st; -@@ -6237,12 +6242,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +@@ -6241,12 +6245,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) TRACE( "Deleting symlink %s\n", unix_name ); @@ -107,7 +106,7 @@ index 522cc38f2fc..0655371dc66 100644 strcpy( tmpdir, unix_name ); d = dirname( tmpdir); if (d != tmpdir) strcpy( tmpdir, d ); -@@ -6255,11 +6261,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) +@@ -6259,11 +6264,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer) tempdir_created = TRUE; strcpy( tmpfile, tmpdir ); strcat( tmpfile, "/tmpfile" );