This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH v2 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: Sun, 29 Dec 2019 17:56:56 +0000
- Subject: [PATCH v2 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=lJ+9Xq+yFUPSB0UkwNSWk+3e+l38SA+M1FyQYCQbJEFFVTe0Dip6vIRv0g8nGL7aoGcX2KpkrcsW22fGvQPYQkHlY8jqpcQTcGlIDptVCfdM231+x3+ikslR5RvoE7B1NUjpuDabTtTI2myBosnu9LywaBdpgnbsrPB1F9458IOYTo/LCaejrLxueSfetRc7faZUI16jwpFZIcBjFA6a3EvBhnaQijBLPguro5U92DXkqCE9xkY5vK3H2pQFq8J3VGJAHWNvukiOZneBXrNQrgDExatbZDNlODYluIPXbmE/per4n4QJmxeX+G1dyCPgwwZMPVI/9iz6+Y1HRpbWHw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mFhnIZ5RVTuoU9nC/naH8o/m8XQLEHlHBfuPA27MSKrjV8ie2D1zLa7yKYaLVGURfrgcMkiMdaaz5U7PdDs4zer7UgukF/IUrNm2GIPCXkJCEg1pu9HVk8fWKToq7EgCWYOiyhkdIsz8+KAfgBUu11EU9a+i/Dbjz0oNYcRseGwLvSX1Ok5MwAy0AD+uSRHlXyW35oZEOJBFLOIL70UvAVZYMNQyej3qwC+wNQUFMKzmL3QQI7Vyj9zXAlHmUkbY2S6c7o3bvfNnw4rSnrwfgIyuu86MirqQgh+7GWlHnlJYJd9y7hOqGM049ZAGTU7N7MWGjZ1BpFxPVse+z78ebg==
- References: <20191229175637.1050-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