VFS: forbid mknod(2) on symlinks

As imposed by POSIX.

Extend a random test to verify this behavior.

Change-Id: Ib70550cefaeb9efd54e22312425263a5606fb5e8
This commit is contained in:
David van Moolenbroek 2016-07-15 14:29:16 +00:00
parent cfd712b424
commit a758ec672e
2 changed files with 8 additions and 3 deletions

View File

@ -520,7 +520,8 @@ int do_mknod(void)
mode_bits = job_m_in.m_lc_vfs_mknod.mode; mode_bits = job_m_in.m_lc_vfs_mknod.mode;
dev = job_m_in.m_lc_vfs_mknod.device; dev = job_m_in.m_lc_vfs_mknod.device;
lookup_init(&resolve, fullpath, PATH_NOFLAGS, &vmp, &vp); /* If the path names a symbolic link, mknod() shall fail with EEXIST. */
lookup_init(&resolve, fullpath, PATH_RET_SYMLINK, &vmp, &vp);
resolve.l_vmnt_lock = VMNT_WRITE; resolve.l_vmnt_lock = VMNT_WRITE;
resolve.l_vnode_lock = VNODE_WRITE; resolve.l_vnode_lock = VNODE_WRITE;

View File

@ -66,8 +66,12 @@ void dangling_slink(int sub_test, char const slink_to[PATH_MAX])
/* Cleanup created files */ /* Cleanup created files */
if (unlink(slink_to) == -1) e(18); if (unlink(slink_to) == -1) e(18);
if (unlink("a") == -1) e(19); if (unlink("c") == -1) e(19);
if (unlink("c") == -1) e(20);
/* Use the dangling symlink to test mknod(2) following symlinks */
if (mknod("a", S_IFCHR | 0777, makedev(1, 1)) != -1) e(20);
if (errno != EEXIST) e(21);
if (unlink("a") == -1) e(22);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else { } else {