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
|
__try
|
||||||
{
|
{
|
||||||
char *path = tp.c_get ();
|
char *path = tp.c_get ();
|
||||||
if (gen_full_path_at (path, dirfd, pathname))
|
int res = gen_full_path_at (path, dirfd, pathname);
|
||||||
__leave;
|
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);
|
return readlink (path, buf, bufsize);
|
||||||
}
|
}
|
||||||
__except (EFAULT) {}
|
__except (EFAULT) {}
|
||||||
|
|
Loading…
Reference in New Issue