Hi all,

In -current and -stable, mountmsdosfs() doesn't not check if
pm_nxtfree exceeds the max cluster in the file system. So if a corrupted
msdos filesystem(which is not uncommon) is written, the following code
in updatefats()@msdosfs_fat.c will generate an unpleasure panic. :)

        u_long cn = pmp->pm_nxtfree;

        if (pmp->pm_freeclustercount
            && (pmp->pm_inusemap[cn / N_INUSEBITS]
                & (1 << (cn % N_INUSEBITS)))) { .... }

A patch of primitive validation for pm_nxtfree in
mountmsdosfs()@msdosfs_vfsops.c is attached in this mail. BTW, does
anyone know why fsck_msdos is missing in FreeBSD?

Cheers,
Jiangyi

*** msdosfs_vfsops.c.orig	Sat Jun 30 14:21:15 2001
--- msdosfs_vfsops.c	Sat Jun 30 14:30:25 2001
***************
*** 681,686 ****
--- 681,692 ----
  	/*
  	 * Check and validate (or perhaps invalidate?) the fsinfo structure?		XXX
  	 */
+     if (pmp->pm_fsinfo && pmp->pm_nxtfree > pmp->pm_maxcluster) {
+         printf ("Next free cluster in FSInfo (%u) exceeds maxcluster (%u)\n",
+                pmp->pm_nxtfree, pmp->pm_maxcluster);
+         error = EINVAL;
+         goto error_exit;
+     }
  
  	/*
  	 * Allocate memory for the bitmap of allocated clusters, and then

Reply via email to