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:
Samuel Thibault 2025-01-19 14:59:13 +01:00
parent 91bb902f58
commit 8ef1791950
4 changed files with 23 additions and 7 deletions

View file

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

View file

@ -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);

View file

@ -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. */

View file

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