This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH v3 1/3] Cygwin: allow opening a symlink with O_PATH | O_NOFOLLOW
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Thu, 16 Jan 2020 20:50:07 +0000
- Subject: [PATCH v3 1/3] Cygwin: allow opening a symlink with O_PATH | O_NOFOLLOW
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cornell.edu; dmarc=pass action=none header.from=cornell.edu; dkim=pass header.d=cornell.edu; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+8tKjAKpN4egFlaFKchE7uxfSgIWvJYnzenAYPwio00=; b=IBDG3Zqs3qOomvw/JpRsdB8WMEyrvgW1n3AgbSy2FPGhIQD45OIa7AQAUgwJEgRytSBd99Iqt0tFWb1PSQ/p4XRqOvhQJH2rTH1jVKEn6+KzUbuFxcKKMaHLdRVcm9gyM+jnpPb172nEVdS04W1Hb0D1G/PIZLKSA0ZrwGsZ8gwORXDTihhnaUwd0/O+oDrfQHkL3IOifmcH0LruGHGS6wFWsT9fxv0EM/h33K/6g+ZOXLC4X0xGg1VlyHaLIDA7Hm10LSRDPVdRykq+j8erL+W+Ljgs6S1PbxE3+stPd/71vZwEJkTi8vSaUNABg1QLkYF+q+GwuQvYnDLu+IIv3A==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KH0R4QnJ0LNizUYJPGYx07qxYXYoPSrfl97JYZyMH6y3bypQfAkTaEFZoR4qyqmYwe5mX6Ff+E6TsvR54dg8luockqhr1oV7gDcW93zIYSzzID6MEiiyNSWPtr5puelPe/BZUYUJiAtAL1vW+NA1Mi8GbQSMpHAPYDoxil+P80CZKpES9xdkyEvTUn5ZjrfruQUojthpONWNrBG1E69OOOZBCm4EfBz7McQGQExIt4us9Nio1dBCcMTMngCEWzkCD133CxIoqCgQ1tqPbUfUPL5YLi9lJgKWP3rqSj9hJyZb6RtijSBLvwLxMhZqitY3SutD/Bxhyg60qQnehh1STA==
- References: <20200116204944.2348-1-kbrown@cornell.edu>
Up to now, opening a symlink with O_NOFOLLOW fails with ELOOP.
Following Linux, allow this to succeed if O_PATH is also specified.
---
winsup/cygwin/syscalls.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 20126ce10..038a316db 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -1470,7 +1470,7 @@ open (const char *unix_path, int flags, ...)
if (!(fh = build_fh_name (unix_path, opt, stat_suffixes)))
__leave; /* errno already set */
- if ((flags & O_NOFOLLOW) && fh->issymlink ())
+ if ((flags & O_NOFOLLOW) && fh->issymlink () && !(flags & O_PATH))
{
set_errno (ELOOP);
__leave;
--
2.21.0