From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2210) id 491653857C7F; Sun, 4 Oct 2020 16:54:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 491653857C7F Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Ken Brown To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: AF_UNIX: use FILE_OPEN_REPARSE_POINT when needed X-Act-Checkin: newlib-cygwin X-Git-Author: Ken Brown X-Git-Refname: refs/heads/master X-Git-Oldrev: ea275093c179fea636470173509615eb6bddad0f X-Git-Newrev: 4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2 Message-Id: <20201004165407.491653857C7F@sourceware.org> Date: Sun, 4 Oct 2020 16:54:07 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Oct 2020 16:54:07 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2 commit 4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2 Author: Ken Brown Date: Mon Sep 28 15:57:56 2020 -0400 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. Diff: --- winsup/cygwin/fhandler.cc | 11 +++++++++-- 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 82b21aff4..5dbbd4068 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 468b05164..d48526619 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;