This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH v4 2/4] Cygwin: readlinkat: allow pathname to be empty
- From: Ken Brown <kbrown at cornell dot edu>
- To: "cygwin-patches at cygwin dot com" <cygwin-patches at cygwin dot com>
- Date: Fri, 17 Jan 2020 16:11:01 +0000
- Subject: [PATCH v4 2/4] Cygwin: readlinkat: allow pathname to be empty
- 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=c1Ye97P8IHhvgEggFni4Qlmofg83gR+Ua/thOVGY+tU=; b=H6HkAkK3RDOgjVunHVfwdoayM1JWw3iZkkzcwvbKOxESOC90epoO56a/5UJXMvoIaVh2m2dcxMMLnVG/PR5rUSBFT48Er1Avk8KujJjkKjyt8h5RhJD4dLwAv0WjlGpbi1cru2f0Exxk5ODAaSHqHJjuRB4CcyxIYERg9R1ctXbe3/0OsPNm8W3PFnA/H4ugk/3EZxFuC4UtvcDxMNxEYWSOcKQn2YzbipjETyhRyujvBSUMHfZ5/BPeGkxG9mpWmtimlFdvipbJp6kcaQcCkIMzwQFcu36/EcsNavcPBv3mLLw/8fDrdRcg35wq62J2bfR1R+vjdNCmF8KMOnDpcQ==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UWGC7keBvZ+1w4wMkPiliKzEy7wZTlr/Xw1G1+4h/yJScgQHbue8urPjUJ+xPORCLIYY4I++jFAfOrjedcx0ga8QL+CmhzdM+wPwfxSfB7OlkG4PD8GRebd/VXoQbJH8+up2EdYE14gbN1A1Sy/7PQCIfeU2KG5owv/2pjlP5+0WP5mE+fxMao9dorA1LLJbJbxUdT4SpvNJNzLyLDUsWkrK4FhsK3keojTNVxmD/3FQLDgBGJ8cL1XeTx5AUwA9rmT3TLsEoX0OMMg8sThmxEBTwZcoUgv8SO7z7QwldC6R+Q9saOw2aJ7YFoIu4Yn6yhdHqPBQpvja+NDeUYs/KA==
- References: <20200117161037.1828-1-kbrown@cornell.edu>
Following Linux, allow the pathname argument to be an empty string,
provided the dirfd argument refers to a symlink opened with
O_PATH | O_NOFOLLOW. The readlinkat call then operates on that
symlink.
---
winsup/cygwin/syscalls.cc | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 038a316db..282d9e0ee 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -4979,8 +4979,23 @@ readlinkat (int dirfd, const char *__restrict pathname, char *__restrict buf,
__try
{
char *path = tp.c_get ();
- if (gen_full_path_at (path, dirfd, pathname))
- __leave;
+ int res = gen_full_path_at (path, dirfd, pathname);
+ if (res)
+ {
+ if (errno != ENOENT)
+ __leave;
+ /* pathname is an empty string. This is OK if dirfd refers
+ to a symlink that was opened with O_PATH | O_NOFOLLOW.
+ In this case, readlinkat operates on the symlink. */
+ cygheap_fdget cfd (dirfd);
+ if (cfd < 0)
+ __leave;
+ if (!(cfd->issymlink ()
+ && cfd->get_flags () & O_PATH
+ && cfd->get_flags () & O_NOFOLLOW))
+ __leave;
+ strcpy (path, cfd->get_name ());
+ }
return readlink (path, buf, bufsize);
}
__except (EFAULT) {}
--
2.21.0