Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Jan 2019 22:30:27 +0000 (UTC)
From:      Kirk McKusick <mckusick@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r342818 - in stable/12/sys: fs/ext2fs kern ufs/ffs ufs/ufs
Message-ID:  <201901062230.x06MURVU049936@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201901062230.x06MURVU049936>