⬢ DragonFlyBSD Kernel Audit
DF-3220 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/dirfs/dirfs_vfsops.c	2026-06-29 12:51:19.000000000 +0000
+++ b/sys/vfs/dirfs/dirfs_vfsops.c	2026-10-26 03:31:04.643709374 +0000
@@ -128,8 +128,9 @@
 		/* Attempt to copy from kernel address */
 		error = copystr(data, &dmp->dm_path, MAXPATHLEN, &done);
 		if (error) {
+			mp->mnt_data = NULL;
 			kfree(dmp, M_DIRFS);
-			goto failure;
+			goto failure_nolog;
 		}
 	}
 
@@ -141,9 +142,10 @@
 	/* Make sure host directory exists and it is indeed a directory. */
 	if ((stat(dmp->dm_path, &st)) == 0) {
 		if (!S_ISDIR(st.st_mode)) {
+			mp->mnt_data = NULL;
 			kfree(dmp, M_DIRFS);
 			error = EINVAL;
-			goto failure;
+			goto failure_nolog;
 		}
 	} else {
 		error = errno;
@@ -169,7 +171,8 @@
 failure:
 	KTR_LOG(dirfs_mount, (dmp->dm_path) ? dmp->dm_path : "NULL",
 	    dmp, mp, error);
-
+failure_nolog:
+	/* dmp may already be freed; only mnt_data cleanup is left */
 	return error;
 }
 
@@ -273,7 +276,7 @@
 	 * call will handle any races and return a locked vnode.
 	 */
 	dirfs_alloc_vp(mp, vpp, LK_CANRECURSE, dnp);
-	KTR_LOG(dirfs_root, dnp, *vpp, dmp->dm_path, dnp->dn_fd, error);
+	KTR_LOG(dirfs_root, dnp, *vpp, dmp->dm_path, dnp->dn_fd, 0);
 
 	return 0;
 }
@@ -300,6 +303,7 @@
 	ksnprintf(st.f_mntfromname, MNAMELEN - 1, "dirfs@%s", dmp->dm_path);
 	bcopy(&st, sbp, sizeof(st));
 	strlcpy(sbp->f_fstypename, mp->mnt_vfc->vfc_name, MFSNAMELEN);
+	sbp->f_fsid = mp->mnt_stat.f_fsid;	/* keep per-mount fsid */
 	dbg(5, "iosize = %zd\n", sbp->f_iosize);
 
 	return 0;
@@ -317,6 +321,7 @@
 		return errno;
 
 	bcopy(&st, sbp, sizeof(st));
+	sbp->f_fsid = mp->mnt_stat.f_fsid;	/* keep per-mount fsid */
 
 	return 0;
 }