--- 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;