mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
hurd: Fix EINVAL error on linking to a slash-trailing path [BZ #32569]
When the target path finishes with a slash, __file_name_split_at returns an empty file name. We can test for this to refuse doing the link.
This commit is contained in:
parent
91bb902f58
commit
8ef1791950
4 changed files with 23 additions and 7 deletions
|
@ -47,8 +47,12 @@ __bind (int fd, __CONST_SOCKADDR_ARG addrarg, socklen_t len)
|
|||
if (dir == MACH_PORT_NULL)
|
||||
return -1;
|
||||
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
err = __dir_mkfile (dir, O_CREAT, 0666 & ~_hurd_umask, &node);
|
||||
if (! *n)
|
||||
/* Can't bind on the existing directory itself. */
|
||||
err = ENOTDIR;
|
||||
else
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
err = __dir_mkfile (dir, O_CREAT, 0666 & ~_hurd_umask, &node);
|
||||
|
||||
if (! err)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,11 @@ __linkat_common (int fromfd, const char *from, int tofd, const char *to, int at_
|
|||
todir = __file_name_split_at (tofd, to, &toname);
|
||||
if (todir != MACH_PORT_NULL)
|
||||
{
|
||||
err = __dir_link (todir, linknode, toname, 1);
|
||||
if (! *toname)
|
||||
/* Can't link to the existing directory itself. */
|
||||
err = ENOTDIR;
|
||||
else
|
||||
err = __dir_link (todir, linknode, toname, 1);
|
||||
__mach_port_deallocate (__mach_task_self (), todir);
|
||||
}
|
||||
__mach_port_deallocate (__mach_task_self (), linknode);
|
||||
|
|
|
@ -88,8 +88,12 @@ __mknodat (int fd, const char *path, mode_t mode, dev_t dev)
|
|||
if (dir == MACH_PORT_NULL)
|
||||
return -1;
|
||||
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
errnode = err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
|
||||
if (! *name)
|
||||
/* Can't link to the existing directory itself. */
|
||||
errnode = err = ENOTDIR;
|
||||
else
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
errnode = err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node);
|
||||
|
||||
if (! err && translator != NULL)
|
||||
/* Set the node's translator to make it a device. */
|
||||
|
|
|
@ -45,8 +45,12 @@ __symlinkat (const char *from, int fd, const char *to)
|
|||
if (dir == MACH_PORT_NULL)
|
||||
return -1;
|
||||
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node);
|
||||
if (! *name)
|
||||
/* Can't link to the existing directory itself. */
|
||||
err = ENOTDIR;
|
||||
else
|
||||
/* Create a new, unlinked node in the target directory. */
|
||||
err = __dir_mkfile (dir, O_WRITE, 0777 & ~_hurd_umask, &node);
|
||||
|
||||
if (! err)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue