]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: forbid mknod(2) on symlinks 41/3341/1
authorDavid van Moolenbroek <david@minix3.org>
Fri, 15 Jul 2016 14:29:16 +0000 (14:29 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Fri, 5 Aug 2016 11:13:38 +0000 (11:13 +0000)
As imposed by POSIX.

Extend a random test to verify this behavior.

Change-Id: Ib70550cefaeb9efd54e22312425263a5606fb5e8

minix/servers/vfs/open.c
minix/tests/test61.c

index 0a8f91af6b5830c4a62e43bf47efe7b1259293fa..5fd23b0d92a7be677b3fee021e846180bedbe591 100644 (file)
@@ -520,7 +520,8 @@ int do_mknod(void)
   mode_bits = job_m_in.m_lc_vfs_mknod.mode;
   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_vnode_lock = VNODE_WRITE;
 
index e7060538742585222a86a016912c01b3995b0d8e..423ec7fe9094a10ae96a53b31f90694e402484e3 100644 (file)
@@ -66,8 +66,12 @@ void dangling_slink(int sub_test, char const slink_to[PATH_MAX])
 
        /* Cleanup created files */
        if (unlink(slink_to) == -1) e(18);
-       if (unlink("a") == -1) e(19);
-       if (unlink("c") == -1) e(20);
+       if (unlink("c") == -1) e(19);
+
+       /* 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);
   } else {