DragonFlyBSD Kernel Audit
DF-3028 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/fuse/fuse_vnops.c
+++ b/sys/vfs/fuse/fuse_vnops.c
@@ -567,6 +567,16 @@
 		vtyp = VFIFO;
 	else
 		vtyp = VBAD;
+
+	/*
+	 * DF-3028: reject S_IFMT values we cannot represent before
+	 * fuse_alloc_node() creates a node whose type hits the
+	 * KKASSERT(0) default in fuse_node_vn().
+	 */
+	if (vtyp == VBAD || vtyp == VNON) {
+		fuse_ipc_put(fip);
+		return EINVAL;
+	}
 
 	error = fuse_alloc_node(fmp, dfnp, feo->nodeid, vtyp, &vp);
 	if (error == 0) {
--- a/sys/vfs/fuse/fuse_node.c
+++ b/sys/vfs/fuse/fuse_node.c
@@ -102,6 +102,8 @@
 	KKASSERT(dfnp->type == VDIR);
 	if (vtyp == VBLK || vtyp == VCHR || vtyp == VFIFO)
 		return EINVAL;
+	if (vtyp == VBAD || vtyp == VNON)	/* DF-3028 */
+		return EINVAL;
 
 	mtx_lock(&fmp->ino_lock);
 	fnp = RB_LOOKUP(fuse_node_tree, &fmp->node_head, ino);