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:
parent
35a1a6dbdf
commit
6cc05784e1
|
@ -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) {}
|
||||
|
|
Loading…
Reference in New Issue