diff options
author | Ken Brown <kbrown@cornell.edu> | 2020-09-28 15:57:56 -0400 |
---|---|---|
committer | Ken Brown <kbrown@cornell.edu> | 2020-10-04 12:53:04 -0400 |
commit | 4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2 (patch) | |
tree | 1cf7b88fbf944152717511ad860f322200bbff27 /winsup | |
parent | ea275093c179fea636470173509615eb6bddad0f (diff) | |
download | newlib-4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2.zip newlib-4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2.tar.gz newlib-4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2.tar.bz2 |
Cygwin: AF_UNIX: use FILE_OPEN_REPARSE_POINT when needed
The following Windows system calls currently fail with
STATUS_IO_REPARSE_TAG_NOT_HANDLED when called on an AF_UNIX socket:
- NtOpenFile in get_file_sd
- NtOpenFile in set_file_sd
- NtCreateFile in fhandler_base::open
Fix this by adding the FILE_OPEN_REPARSE_POINT flag to those calls
when the file is a known reparse point.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/fhandler.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/security.cc | 8 |
2 files changed, 15 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 82b21af..5dbbd40 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -620,13 +620,20 @@ fhandler_base::open (int flags, mode_t mode) else create_disposition = (flags & O_CREAT) ? FILE_OPEN_IF : FILE_OPEN; - if (get_device () == FH_FS) + if (get_device () == FH_FS +#ifdef __WITH_AF_UNIX + || get_device () == FH_UNIX +#endif + ) { - /* Add the reparse point flag to known repares points, otherwise we + /* Add the reparse point flag to known reparse points, otherwise we open the target, not the reparse point. This would break lstat. */ if (pc.is_known_reparse_point ()) options |= FILE_OPEN_REPARSE_POINT; + } + if (get_device () == FH_FS) + { /* O_TMPFILE files are created with delete-on-close semantics, as well as with FILE_ATTRIBUTE_TEMPORARY. The latter speeds up file access, because the OS tries to keep the file in memory as much as possible. diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index 468b051..d485266 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -65,7 +65,9 @@ get_file_sd (HANDLE fh, path_conv &pc, security_descriptor &sd, fh ? pc.init_reopen_attr (attr, fh) : pc.get_object_attr (attr, sec_none_nih), &io, FILE_SHARE_VALID_FLAGS, - FILE_OPEN_FOR_BACKUP_INTENT); + FILE_OPEN_FOR_BACKUP_INTENT + | pc.is_known_reparse_point () + ? FILE_OPEN_REPARSE_POINT : 0); if (!NT_SUCCESS (status)) { sd.free (); @@ -232,7 +234,9 @@ set_file_sd (HANDLE fh, path_conv &pc, security_descriptor &sd, bool is_chown) : pc.get_object_attr (attr, sec_none_nih), &io, FILE_SHARE_VALID_FLAGS, - FILE_OPEN_FOR_BACKUP_INTENT); + FILE_OPEN_FOR_BACKUP_INTENT + | pc.is_known_reparse_point () + ? FILE_OPEN_REPARSE_POINT : 0); if (!NT_SUCCESS (status)) { fh = NULL; |