⬢ DragonFlyBSD Kernel Audit
DF-3132 / fix.diff
← back to finding ↓ download raw
--- a/sys/vfs/msdosfs/msdosfs_vfsops.c
+++ b/sys/vfs/msdosfs/msdosfs_vfsops.c
@@ -406,10 +406,19 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp, struct msdosfs_args *argp)
 	if (pmp->pm_RootDirEnts == 0) {
 		if (pmp->pm_FATsecs != 0 || getushort(b710->bpbFSVers) != 0) {
 			error = EINVAL;
 			kprintf("mountmsdosfs(): bad FAT32 filesystem\n");
 			goto error_exit;
 		}
 		pmp->pm_fatmask = FAT32_MASK;
+		if (pmp->pm_FATs == 0) {
+			error = EINVAL;
+			kprintf("mountmsdosfs(): zero FAT count\n");
+			goto error_exit;
+		}
 		pmp->pm_fatmult = 4;
 		pmp->pm_fatdiv = 1;
 		pmp->pm_FATsecs = getulong(b710->bpbBigFATsecs);
 		if ((getushort(b710->bpbExtFlags) & FATMIRROR) != 0)
 			pmp->pm_curfat = getushort(b710->bpbExtFlags) & FATNUM;
 		else
 			pmp->pm_flags |= MSDOSFS_FATMIRROR;
+		if (pmp->pm_curfat >= pmp->pm_FATs) {
+			error = EINVAL;
+			kprintf("mountmsdosfs(): active FAT %ld exceeds FAT count %d\n",
+			    pmp->pm_curfat, pmp->pm_FATs);
+			goto error_exit;
+		}
 	} else
 		pmp->pm_flags |= MSDOSFS_FATMIRROR;