⬢ DragonFlyBSD Kernel Audit
DF-3075 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/nfs/nfs_vfsops.c	2026-06-29 12:51:19.000000000 +0000
+++ b/sys/vfs/nfs/nfs_vfsops.c	2026-10-26 03:29:41.720762279 +0000
@@ -357,17 +357,25 @@
 	if (info.v3) {
 		sbp->f_bsize = NFS_FABLKSIZE;
 		tquad = fxdr_hyper(&sfp->sf_tbytes);
-		sbp->f_blocks = (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
+		sbp->f_blocks = (tquad > (u_quad_t)LONG_MAX) ?
+		    LONG_MAX : (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
 		tquad = fxdr_hyper(&sfp->sf_fbytes);
-		sbp->f_bfree = (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
+		sbp->f_bfree = (tquad > (u_quad_t)LONG_MAX) ?
+		    LONG_MAX : (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
 		tquad = fxdr_hyper(&sfp->sf_abytes);
-		sbp->f_bavail = (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
+		sbp->f_bavail = (tquad > (u_quad_t)LONG_MAX) ?
+		    LONG_MAX : (long)(tquad / ((u_quad_t)NFS_FABLKSIZE));
 		sbp->f_files = (fxdr_unsigned(int32_t,
 		    sfp->sf_tfiles.nfsuquad[1]) & 0x7fffffff);
 		sbp->f_ffree = (fxdr_unsigned(int32_t,
 		    sfp->sf_ffiles.nfsuquad[1]) & 0x7fffffff);
 	} else {
+		/* sanity clamp the v2 server-claimed block size */
 		sbp->f_bsize = fxdr_unsigned(int32_t, sfp->sf_bsize);
+		if (sbp->f_bsize < DEV_BSIZE)
+			sbp->f_bsize = NFS_FABLKSIZE;
+		else if (sbp->f_bsize > MAXBSIZE)
+			sbp->f_bsize = MAXBSIZE;
 		sbp->f_blocks = fxdr_unsigned(int32_t, sfp->sf_blocks);
 		sbp->f_bfree = fxdr_unsigned(int32_t, sfp->sf_bfree);
 		sbp->f_bavail = fxdr_unsigned(int32_t, sfp->sf_bavail);
@@ -441,17 +449,22 @@
 	sbp->f_owner = nmp->nm_cred->cr_ruid;
 
 	if (info.v3) {
+		u_quad_t qv;
+
 		sbp->f_bsize = NFS_FABLKSIZE;
 		sbp->f_frsize = NFS_FABLKSIZE;
-		sbp->f_blocks = (fxdr_hyper(&sfp->sf_tbytes) /
-				((u_quad_t)NFS_FABLKSIZE));
-		sbp->f_bfree = (fxdr_hyper(&sfp->sf_fbytes) /
-				((u_quad_t)NFS_FABLKSIZE));
-		sbp->f_bavail = (fxdr_hyper(&sfp->sf_abytes) /
-				((u_quad_t)NFS_FABLKSIZE));
-		sbp->f_files = fxdr_hyper(&sfp->sf_tfiles);
-		sbp->f_ffree = fxdr_hyper(&sfp->sf_ffiles);
-		sbp->f_favail = fxdr_hyper(&sfp->sf_afiles);
+		qv = fxdr_hyper(&sfp->sf_tbytes) / ((u_quad_t)NFS_FABLKSIZE);
+		sbp->f_blocks = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
+		qv = fxdr_hyper(&sfp->sf_fbytes) / ((u_quad_t)NFS_FABLKSIZE);
+		sbp->f_bfree = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
+		qv = fxdr_hyper(&sfp->sf_abytes) / ((u_quad_t)NFS_FABLKSIZE);
+		sbp->f_bavail = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
+		qv = fxdr_hyper(&sfp->sf_tfiles);
+		sbp->f_files = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
+		qv = fxdr_hyper(&sfp->sf_ffiles);
+		sbp->f_ffree = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
+		qv = fxdr_hyper(&sfp->sf_afiles);
+		sbp->f_favail = (qv > (u_quad_t)LONG_MAX) ? LONG_MAX : qv;
 	} else {
 		sbp->f_bsize = fxdr_unsigned(int32_t, sfp->sf_bsize);
 		sbp->f_blocks = fxdr_unsigned(int32_t, sfp->sf_blocks);