This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin] cygwin: unlink: fix "final trick" overwrite method on remote drives
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 18 Oct 2017 14:29:37 -0000
- Subject: [newlib-cygwin] cygwin: unlink: fix "final trick" overwrite method on remote drives
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=e6c79e7a2ab7fe9e1d45c25526841e035ee67407
commit e6c79e7a2ab7fe9e1d45c25526841e035ee67407
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Wed Oct 18 16:21:12 2017 +0200
cygwin: unlink: fix "final trick" overwrite method on remote drives
The "final trick" code in try_to_bin accidentally never worked on
remote drives because it relies on rootdir. Which isn't set for
remote unlinks. The code now creates a full path for remote files.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/syscalls.cc | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index e64b017..8ccc768 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -542,8 +542,22 @@ try_to_bin (path_conv &pc, HANDLE &fh, ACCESS_MASK access, ULONG flags)
delete-on-close on the original file succeeds. There are still
cases in which this fails, for instance, when trying to delete a
hardlink to a DLL used by the unlinking application itself. */
- RtlAppendUnicodeToString (&recycler, L"X");
- InitializeObjectAttributes (&attr, &recycler, 0, rootdir, NULL);
+ if (pc.isremote ())
+ {
+ /* In the remote case we need the full path, but recycler is only
+ a relative path. Convert to absolute path. */
+ RtlInitEmptyUnicodeString (&fname, (PCWSTR) tp.w_get (),
+ (NT_MAX_PATH - 1) * sizeof (WCHAR));
+ RtlCopyUnicodeString (&fname, pc.get_nt_native_path ());
+ RtlSplitUnicodePath (&fname, &fname, NULL);
+ /* Reset max length, overwritten by RtlSplitUnicodePath. */
+ fname.MaximumLength = (NT_MAX_PATH - 1) * sizeof (WCHAR); /* reset */
+ RtlAppendUnicodeStringToString (&fname, &recycler);
+ }
+ else
+ fname = recycler;
+ RtlAppendUnicodeToString (&fname, L"X");
+ InitializeObjectAttributes (&attr, &fname, 0, rootdir, NULL);
status = NtCreateFile (&tmp_fh, DELETE, &attr, &io, NULL,
FILE_ATTRIBUTE_NORMAL, 0, FILE_SUPERSEDE,
FILE_NON_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE,