[newlib-cygwin] Cygwin: open(2): Change comment in disabled O_TMPFILE POSIX unlink code
Corinna Vinschen
corinna@sourceware.org
Wed Dec 26 21:17:00 GMT 2018
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=07e0a9584f9a5b2668c767ede0482a5fba498731
commit 07e0a9584f9a5b2668c767ede0482a5fba498731
Author: Corinna Vinschen <corinna@vinschen.de>
Date: Wed Dec 26 21:51:13 2018 +0100
Cygwin: open(2): Change comment in disabled O_TMPFILE POSIX unlink code
- Turns out, the definition of POSIX unlink semantics is half-hearted
so far: It's not possible to link an open file HANDLE if it has
been deleted with POSIX semantics, nor is it possible to remove
the delete disposition. This breaks linkat on an O_TMPFILE.
Tested with W10 1809.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diff:
---
winsup/cygwin/syscalls.cc | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index c1a3ed4..0d48090 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -1468,13 +1468,20 @@ open (const char *unix_path, int flags, ...)
|| !fh->open_with_arch (flags, mode & 07777))
__leave; /* errno already set */
#if 0
- /* W10 1709 POSIX unlink semantics:
+ /* Don't use W10 1709 POSIX unlink semantics here.
- TODO: Works nicely for O_TEMPFILE but using linkat requires that
- we first fix /proc/self/fd handling to allow opening by handle
- rather than by symlinked filename only. */
+ Including W10 1809, NtSetInformationFile(FileLinkInformation) on a
+ HANDLE to a file unlinked with POSIX semantics fails with
+ STATUS_ACCESS_DENIED. Trying to remove the delete disposition on
+ the file prior to calling link fails with STATUS_FILE_DELETED.
+ This breaks
+
+ fd = open(O_TMPFILE);
+ linkat("/proc/self/fd/<fd>);
+
+ semantics. */
if ((flags & O_TMPFILE) && wincap.has_posix_file_info ()
- && fh->pc.fs_is_ntfs ())
+ && !fh->pc.isremote () && fh->pc.fs_is_ntfs ())
{
HANDLE del_h;
OBJECT_ATTRIBUTES attr;
More information about the Cygwin-cvs
mailing list