Cygwin: readlinkat: allow pathname to be empty

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.
This commit is contained in:
Ken Brown 2019-12-27 17:17:35 -05:00
parent 35a1a6dbdf
commit 6cc05784e1
1 changed files with 17 additions and 2 deletions

View File

@ -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) {}