This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH 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: Sat, 28 Dec 2019 19:52:29 +0000
- Subject: [PATCH 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=aOfh4nxXYjdHOlCHR9nq0y0et4ohCxV1bNmMgvsDCRBXG4CLM9uNdYJ1PtBkwPSc46GJf+2FB0Y6M++kNeucx1fVDPiCYxascjTKO9OlGlCksHhXMckR8AJ4NE5SdiTHV7Gl+W7go+g8ruMQVRyVr+lAgj7WHKhVH5zoY+2jDDGPPQYBybcrvH/DyhMuk9FRLchtDLOC9wKtczUzgKRE9yGAe7HVHfY9F0L2+ncPGRu5b61RVbjWlGcsdbsrXoZwAx3jOy7nhqQhl1ZsXXxXgQHmtS37D93EgjO1Saatx/yys6QhqORNAUfRy9usPvphdBJPimqBKcHqu8yA7GF7Fw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O7nkMSjHRWm3cgtMarnaIiT6yLLqpYJF2ur7uAF4UZmj3S6EENO/L123AWsCOrEan/bH1FHjNokmQmY74LKU1kKyLN7pKMPKbWpbC+mIwNUd7/V0rKlVB4mlQIkT+U5gBkYn7zbPJGHMmIuIQEk/Et0A3KI2mwJE+R99BkYUopYxI10dJNXJ1uOsFThy3vXd5ixC/NsRsuRB6aauBnowZHnwD96c29yahIrTVUil/tA8A82dM70FfcFC0ZtHkxRCE3eJupMO/kO7/eroAGrDWv8YKeIjlS2KLdE0Pn7o94hFBPwmMOKTX4IRQrR/Xfd5bE+S7nND2X1tXpNLXCpG8Q==
- References: <20191228195213.1570-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