svn commit: r342818 - in stable/12/sys: fs/ext2fs kern ufs/ffs ufs/ufs
Kirk McKusick
mckusick at FreeBSD.org
Sun Jan 6 22:30:29 UTC 2019
Author: mckusick
Date: Sun Jan 6 22:30:27 2019
New Revision: 342818
URL: https://svnweb.freebsd.org/changeset/base/342818
Log:
MFC of 342548
When loading an inode from disk, verify that its mode is valid.
Sponsored by: Netflix
Modified:
stable/12/sys/fs/ext2fs/ext2_vnops.c
stable/12/sys/kern/vfs_subr.c
stable/12/sys/ufs/ffs/ffs_snapshot.c
stable/12/sys/ufs/ufs/ufs_vnops.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- stable/12/sys/fs/ext2fs/ext2_vnops.c Sun Jan 6 21:43:14 2019 (r342817)
+++ stable/12/sys/fs/ext2fs/ext2_vnops.c Sun Jan 6 22:30:27 2019 (r342818)
@@ -1920,6 +1920,11 @@ ext2_vinit(struct mount *mntp, struct vop_vector *fifo
vp = *vpp;
ip = VTOI(vp);
vp->v_type = IFTOVT(ip->i_mode);
+ /*
+ * Only unallocated inodes should be of type VNON.
+ */
+ if (ip->i_mode != 0 && vp->v_type == VNON)
+ return (EINVAL);
if (vp->v_type == VFIFO)
vp->v_op = fifoops;
Modified: stable/12/sys/kern/vfs_subr.c
==============================================================================
--- stable/12/sys/kern/vfs_subr.c Sun Jan 6 21:43:14 2019 (r342817)
+++ stable/12/sys/kern/vfs_subr.c Sun Jan 6 22:30:27 2019 (r342818)
@@ -156,7 +156,7 @@ SYSCTL_ULONG(_vfs, OID_AUTO, mnt_free_list_batch, CTLF
*/
enum vtype iftovt_tab[16] = {
VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON,
- VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VBAD,
+ VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VNON
};
int vttoif_tab[10] = {
0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK,
Modified: stable/12/sys/ufs/ffs/ffs_snapshot.c
==============================================================================
--- stable/12/sys/ufs/ffs/ffs_snapshot.c Sun Jan 6 21:43:14 2019 (r342817)
+++ stable/12/sys/ufs/ffs/ffs_snapshot.c Sun Jan 6 22:30:27 2019 (r342818)
@@ -1998,15 +1998,19 @@ ffs_snapshot_mount(mp)
continue;
}
ip = VTOI(vp);
- if (!IS_SNAPSHOT(ip) || ip->i_size ==
+ if (vp->v_type != VREG) {
+ reason = "non-file snapshot";
+ } else if (!IS_SNAPSHOT(ip)) {
+ reason = "non-snapshot";
+ } else if (ip->i_size ==
lblktosize(fs, howmany(fs->fs_size, fs->fs_frag))) {
- if (!IS_SNAPSHOT(ip)) {
- reason = "non-snapshot";
- } else {
- reason = "old format snapshot";
- (void)ffs_truncate(vp, (off_t)0, 0, NOCRED);
- (void)ffs_syncvnode(vp, MNT_WAIT, 0);
- }
+ reason = "old format snapshot";
+ (void)ffs_truncate(vp, (off_t)0, 0, NOCRED);
+ (void)ffs_syncvnode(vp, MNT_WAIT, 0);
+ } else {
+ reason = NULL;
+ }
+ if (reason != NULL) {
printf("ffs_snapshot_mount: %s inode %d\n",
reason, fs->fs_snapinum[snaploc]);
vput(vp);
Modified: stable/12/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- stable/12/sys/ufs/ufs/ufs_vnops.c Sun Jan 6 21:43:14 2019 (r342817)
+++ stable/12/sys/ufs/ufs/ufs_vnops.c Sun Jan 6 22:30:27 2019 (r342818)
@@ -2517,6 +2517,11 @@ ufs_vinit(mntp, fifoops, vpp)
vp = *vpp;
ip = VTOI(vp);
vp->v_type = IFTOVT(ip->i_mode);
+ /*
+ * Only unallocated inodes should be of type VNON.
+ */
+ if (ip->i_mode != 0 && vp->v_type == VNON)
+ return (EINVAL);
if (vp->v_type == VFIFO)
vp->v_op = fifoops;
ASSERT_VOP_LOCKED(vp, "ufs_vinit");
More information about the svn-src-stable
mailing list