CVS commit: [netbsd-6] src/sys/fs/msdosfs
Module Name:src Committed By: martin Date: Tue Oct 17 15:43:09 UTC 2017 Modified Files: src/sys/fs/msdosfs [netbsd-6]: msdosfs_vfsops.c Log Message: Apply patch form mlelstv to fix the build after pullup #1506 To generate a diff of this commit: cvs rdiff -u -r1.93.6.4 -r1.93.6.5 src/sys/fs/msdosfs/msdosfs_vfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/msdosfs/msdosfs_vfsops.c diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.4 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.5 --- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.4 Fri Oct 13 08:05:30 2017 +++ src/sys/fs/msdosfs/msdosfs_vfsops.c Tue Oct 17 15:43:09 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.4 2017/10/13 08:05:30 snj Exp $ */ +/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.5 2017/10/17 15:43:09 martin Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.4 2017/10/13 08:05:30 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.5 2017/10/17 15:43:09 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -712,8 +712,8 @@ msdosfs_mountfs(struct vnode *devvp, str /* validate cluster count against FAT */ if ((pmp->pm_maxcluster & pmp->pm_fatmask) != pmp->pm_maxcluster) { - DPRINTF("maxcluster %lu outside of mask %#lx\n", - pmp->pm_maxcluster, pmp->pm_fatmask); + DPRINTF(("maxcluster %lu outside of mask %#lx\n", + pmp->pm_maxcluster, pmp->pm_fatmask)); error = EINVAL; goto error_exit; } @@ -723,8 +723,8 @@ msdosfs_mountfs(struct vnode *devvp, str fatblocksecs = howmany(fatbytes, pmp->pm_BytesPerSec); if (pmp->pm_FATsecs != fatblocksecs) { - DPRINTF("FATsecs %lu != real %lu\n", pmp->pm_FATsecs, - fatblocksecs); + DPRINTF(("FATsecs %lu != real %lu\n", pmp->pm_FATsecs, + fatblocksecs)); error = EINVAL; goto error_exit; }
CVS commit: [netbsd-6] src/sys/fs/msdosfs
Module Name:src Committed By: snj Date: Fri Oct 13 08:05:30 UTC 2017 Modified Files: src/sys/fs/msdosfs [netbsd-6]: msdosfs_vfsops.c Log Message: Pull up following revision(s) (requested by mlelstv in ticket #1506): sys/fs/msdosfs/msdosfs_vfsops.c: revision 1.128 Add more sanity checks for BPB parameters. Handle FAT12 format for media with sectors >= 32kByte. Does fix PR 52485. To generate a diff of this commit: cvs rdiff -u -r1.93.6.3 -r1.93.6.4 src/sys/fs/msdosfs/msdosfs_vfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/msdosfs/msdosfs_vfsops.c diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.3 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.4 --- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.3 Sun Nov 9 06:37:00 2014 +++ src/sys/fs/msdosfs/msdosfs_vfsops.c Fri Oct 13 08:05:30 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.3 2014/11/09 06:37:00 msaitoh Exp $ */ +/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.4 2017/10/13 08:05:30 snj Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.3 2014/11/09 06:37:00 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.4 2017/10/13 08:05:30 snj Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -479,6 +479,7 @@ msdosfs_mountfs(struct vnode *devvp, str int ronly, error, BlkPerSec; uint64_t psize; unsigned secsize; + u_long fatbytes, fatblocksecs; /* Flush out any old buffers remaining from a previous use. */ if ((error = vinvalbuf(devvp, V_SAVE, l->l_cred, l, 0, 0)) != 0) @@ -708,12 +709,40 @@ msdosfs_mountfs(struct vnode *devvp, str pmp->pm_fatdiv = 1; } } - if (FAT12(pmp)) - pmp->pm_fatblocksize = 3 * pmp->pm_BytesPerSec; - else + + /* validate cluster count against FAT */ + if ((pmp->pm_maxcluster & pmp->pm_fatmask) != pmp->pm_maxcluster) { + DPRINTF("maxcluster %lu outside of mask %#lx\n", + pmp->pm_maxcluster, pmp->pm_fatmask); + error = EINVAL; + goto error_exit; + } + + /* validate FAT size */ + fatbytes = (pmp->pm_maxcluster+1) * pmp->pm_fatmult / pmp->pm_fatdiv; + fatblocksecs = howmany(fatbytes, pmp->pm_BytesPerSec); + + if (pmp->pm_FATsecs != fatblocksecs) { + DPRINTF("FATsecs %lu != real %lu\n", pmp->pm_FATsecs, + fatblocksecs); + error = EINVAL; + goto error_exit; + } + + if (FAT12(pmp)) { + /* + * limit block size to what is needed to read a FAT block + * to not exceed MAXBSIZE + */ + pmp->pm_fatblocksec = min(3, fatblocksecs); + pmp->pm_fatblocksize = pmp->pm_fatblocksec + * pmp->pm_BytesPerSec; + } else { pmp->pm_fatblocksize = MAXBSIZE; + pmp->pm_fatblocksec = pmp->pm_fatblocksize + / pmp->pm_BytesPerSec; + } - pmp->pm_fatblocksec = pmp->pm_fatblocksize / pmp->pm_BytesPerSec; pmp->pm_bnshift = ffs(pmp->pm_BytesPerSec) - 1; /*
CVS commit: [netbsd-6] src/sys/fs/msdosfs
Module Name:src Committed By: msaitoh Date: Sun Nov 9 06:37:01 UTC 2014 Modified Files: src/sys/fs/msdosfs [netbsd-6]: msdosfs_vfsops.c Log Message: Pull up following revision(s) (requested by maxv in ticket #1171): sys/fs/msdosfs/msdosfs_vfsops.c: revision 1.110 via patch - From me, FreeBSD, OpenBSD and the FAT specification. Ok christos@ - Perform sanity checks not just for GEMDOSFS, but for all FAT devices. This also fixes a division-by-zero bug that could crash the system. - Define GEMDOSFS_BSIZE instead of a hard-coded 512 value, and remove 'bsize'. - Rename 'tmp' to 'BlkPerSec'. - Remove 'secsize==0' and added 'secsizeModified files: Index: src/sys/fs/msdosfs/msdosfs_vfsops.c diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.2 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.3 --- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93.6.2 Mon Apr 21 10:14:19 2014 +++ src/sys/fs/msdosfs/msdosfs_vfsops.c Sun Nov 9 06:37:00 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.2 2014/04/21 10:14:19 bouyer Exp $ */ +/* $NetBSD: msdosfs_vfsops.c,v 1.93.6.3 2014/11/09 06:37:00 msaitoh Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.2 2014/04/21 10:14:19 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93.6.3 2014/11/09 06:37:00 msaitoh Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -93,6 +93,8 @@ MODULE(MODULE_CLASS_VFS, msdos, NULL); #define DPRINTF(a) #endif +#define GEMDOSFS_BSIZE 512 + #define MSDOSFS_NAMEMAX(pmp) \ (pmp)->pm_flags & MSDOSFSMNT_LONGNAME ? WIN_MAXLEN : 12 @@ -474,8 +476,7 @@ msdosfs_mountfs(struct vnode *devvp, str struct byte_bpb50 *b50; struct byte_bpb710 *b710; uint8_t SecPerClust; - int ronly, error, tmp; - int bsize; + int ronly, error, BlkPerSec; uint64_t psize; unsigned secsize; @@ -493,7 +494,7 @@ msdosfs_mountfs(struct vnode *devvp, str goto error_exit; error = getdisksize(devvp, &psize, &secsize); - if (error || secsize == 0) { + if (error) { if (argp->flags & MSDOSFSMNT_GEMDOSFS) goto error_exit; @@ -502,16 +503,19 @@ msdosfs_mountfs(struct vnode *devvp, str psize = 0; error = 0; } + if (secsize < DEV_BSIZE) { + DPRINTF(("Invalid block secsize (%d < DEV_BSIZE)", secsize)); + error = EINVAL; + goto error_exit; + } if (argp->flags & MSDOSFSMNT_GEMDOSFS) { - bsize = secsize; - if (bsize != 512) { - DPRINTF(("Invalid block bsize %d for gemdos\n", bsize)); + if (secsize != GEMDOSFS_BSIZE) { + DPRINTF(("Invalid block secsize %d for GEMDOS\n", secsize)); error = EINVAL; goto error_exit; } - } else - bsize = 0; + } /* * Read the boot sector of the filesystem, and then check the @@ -555,19 +559,6 @@ msdosfs_mountfs(struct vnode *devvp, str pmp->pm_Heads = getushort(b50->bpbHeads); pmp->pm_Media = b50->bpbMedia; - if (!(argp->flags & MSDOSFSMNT_GEMDOSFS)) { - /* XXX - We should probably check more values here */ - if (!pmp->pm_BytesPerSec || !SecPerClust - || pmp->pm_SecPerTrack > 63) { - DPRINTF(("bytespersec %d secperclust %d " - "secpertrack %d\n", - pmp->pm_BytesPerSec, SecPerClust, - pmp->pm_SecPerTrack)); - error = EINVAL; - goto error_exit; - } - } - if (pmp->pm_Sectors == 0) { pmp->pm_HiddenSects = getulong(b50->bpbHiddenSecs); pmp->pm_HugeSectors = getulong(b50->bpbHugeSectors); @@ -576,6 +567,29 @@ msdosfs_mountfs(struct vnode *devvp, str pmp->pm_HugeSectors = pmp->pm_Sectors; } + /* + * Sanity checks, from the FAT specification: + * - sectors per cluster: >= 1, power of 2 + * - logical sector size: >= 1, power of 2 + * - cluster size:<= max FS block size + * - number of sectors: >= 1 + */ + if ((SecPerClust == 0) || !powerof2(SecPerClust) || + (pmp->pm_BytesPerSec == 0) || !powerof2(pmp->pm_BytesPerSec) || + (SecPerClust * pmp->pm_BytesPerSec > MAXBSIZE) || + (pmp->pm_HugeSectors == 0)) { + DPRINTF(("consistency checks\n")); + error = EINVAL; + goto error_exit; + } + + if (!(argp->flags & MSDOSFSMNT_GEMDOSFS) && + (pmp->pm_SecPerTrack > 63)) { + DPRINTF(("SecPerTrack %d\n", pmp->pm_SecPerTrack)); + error = EINVAL; + goto error_exit; + } + if (pmp->pm_RootDirEnts == 0) { unsigned short vers = getushort(b710->bpbFSVers); /* @@ -614,17 +628,12 @@ msdosfs_mountfs(struct vnode *devvp, str /* * Check a few values (could do some more): - * - logical sector size: power of 2, >= block size - * - sectors per cluster: power of 2, >= 1 - * - number of sectors: >= 1, <= size of partition + * - logical sector size: >= block size + * - number of sectors: <= size of partition */ - if ( (SecPerClust == 0) - || (SecPerClust & (SecPerClust - 1)) - || (pmp->pm_BytesPerSec < bsize) - || (pmp->pm_BytesPerSec & (pmp->pm_BytesPerSec - 1)) - || (pmp->pm_HugeSectors == 0) - || (pmp->pm_HugeSec
CVS commit: [netbsd-6] src/sys/fs/msdosfs
Module Name:src Committed By: riz Date: Mon Apr 16 15:37:12 UTC 2012 Modified Files: src/sys/fs/msdosfs [netbsd-6]: msdosfs_fat.c Log Message: Pull up following revision(s) (requested by hannken in ticket #183): sys/fs/msdosfs/msdosfs_fat.c: revision 1.20 pcbmap(): We cannot use bread() here as for the pagedaemon getblk() may fail leading to a panic in bread(). Replace bread() with getblk() / VOP_STRATEGY() and return an error if getblk() fails. Fixes PR#46282: 6.0_BETA crash: msdosfs_bmap -> pcbmap -> bread -> bio_doread This is an interim solution for easy pullup. The final solution is be to change bread() to not return a buffer on error. As we have to change all callers of bread() this will not qualify for a pullup. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.19.18.1 src/sys/fs/msdosfs/msdosfs_fat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/msdosfs/msdosfs_fat.c diff -u src/sys/fs/msdosfs/msdosfs_fat.c:1.19 src/sys/fs/msdosfs/msdosfs_fat.c:1.19.18.1 --- src/sys/fs/msdosfs/msdosfs_fat.c:1.19 Tue Jan 26 20:25:52 2010 +++ src/sys/fs/msdosfs/msdosfs_fat.c Mon Apr 16 15:37:12 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_fat.c,v 1.19 2010/01/26 20:25:52 joerg Exp $ */ +/* $NetBSD: msdosfs_fat.c,v 1.19.18.1 2012/04/16 15:37:12 riz Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_fat.c,v 1.19 2010/01/26 20:25:52 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_fat.c,v 1.19.18.1 2012/04/16 15:37:12 riz Exp $"); /* * kernel include files. @@ -254,11 +254,26 @@ pcbmap(struct denode *dep, u_long findcn if (bn != bp_bn) { if (bp) brelse(bp, 0); - error = bread(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, - NOCRED, 0, &bp); - if (error) { -brelse(bp, 0); -return (error); + bp = getblk(pmp->pm_devvp, de_bn2kb(pmp, bn), bsize, + 0, 0); + if (bp == NULL) { +/* + * getblk() above returns NULL only iff we are + * pagedaemon. See the implementation of getblk + * for detail. + */ +return ENOMEM; + } + if (!ISSET(bp->b_oflags, (BO_DONE | BO_DELWRI))) { +SET(bp->b_flags, B_READ); +BIO_SETPRIO(bp, BPRIO_TIMECRITICAL); +VOP_STRATEGY(pmp->pm_devvp, bp); +curlwp->l_ru.ru_inblock++; +error = biowait(bp); +if (error) { + brelse(bp, 0); + return error; +} } bp_bn = bn; }
CVS commit: [netbsd-6] src/sys/fs/msdosfs
Module Name:src Committed By: riz Date: Fri Apr 6 17:40:21 UTC 2012 Modified Files: src/sys/fs/msdosfs [netbsd-6]: msdosfs_vnops.c Log Message: Pull up following revision(s) (requested by njoly in ticket #161): sys/fs/msdosfs/msdosfs_vnops.c: revision 1.81 sys/fs/msdosfs/msdosfs_vnops.c: revision 1.82 Report the SF_ARCHIVED file flag if set. Add missing braces in previous commit. To generate a diff of this commit: cvs rdiff -u -r1.79 -r1.79.4.1 src/sys/fs/msdosfs/msdosfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/msdosfs/msdosfs_vnops.c diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.79 src/sys/fs/msdosfs/msdosfs_vnops.c:1.79.4.1 --- src/sys/fs/msdosfs/msdosfs_vnops.c:1.79 Mon Nov 21 10:46:56 2011 +++ src/sys/fs/msdosfs/msdosfs_vnops.c Fri Apr 6 17:40:20 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.79 2011/11/21 10:46:56 hannken Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.79.4.1 2012/04/06 17:40:20 riz Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.79 2011/11/21 10:46:56 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.79.4.1 2012/04/06 17:40:20 riz Exp $"); #include #include @@ -304,8 +304,10 @@ msdosfs_getattr(void *v) vap->va_ctime = vap->va_mtime; } vap->va_flags = 0; - if ((dep->de_Attributes & ATTR_ARCHIVE) == 0) + if ((dep->de_Attributes & ATTR_ARCHIVE) == 0) { + vap->va_flags |= SF_ARCHIVED; vap->va_mode |= S_ARCH1; + } vap->va_gen = 0; vap->va_blocksize = pmp->pm_bpcluster; vap->va_bytes =