PR/32003: Brian Buhrow: msdosfs doesn't properly zero out high cluster data

on non-FAT32 msdos filesystems.
This commit is contained in:
christos 2005-11-04 21:04:20 +00:00
parent a0a8d930a4
commit fe1de4d6e3
2 changed files with 11 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: denode.h,v 1.9 2005/11/02 12:38:58 yamt Exp $ */
/* $NetBSD: denode.h,v 1.10 2005/11/04 21:04:20 christos Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@ -202,6 +202,8 @@ struct denode {
#define DE_EXTERNALIZE32(dp, dep) \
putushort((dp)->deHighClust, (dep)->de_StartCluster >> 16)
#define DE_EXTERNALIZE16(dp, dep) \
putushort((dp)->deHighClust, 0)
#define DE_EXTERNALIZE(dp, dep) \
(memcpy((dp)->deName, (dep)->de_Name, 11), \
(dp)->deAttributes = (dep)->de_Attributes, \
@ -214,7 +216,7 @@ struct denode {
putushort((dp)->deStartCluster, (dep)->de_StartCluster), \
putulong((dp)->deFileSize, \
((dep)->de_Attributes & ATTR_DIRECTORY) ? 0 : (dep)->de_FileSize), \
(FAT32((dep)->de_pmp) ? DE_EXTERNALIZE32((dp), (dep)) : 0))
(FAT32((dep)->de_pmp) ? DE_EXTERNALIZE32((dp), (dep)) : DE_EXTERNALIZE16((dp), (dep))))
#define de_forw de_chain[0]
#define de_back de_chain[1]

View File

@ -1,4 +1,4 @@
/* $NetBSD: msdosfs_vnops.c,v 1.21 2005/11/02 12:38:58 yamt Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.22 2005/11/04 21:04:20 christos Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.21 2005/11/02 12:38:58 yamt Exp $");
__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.22 2005/11/04 21:04:20 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1130,6 +1130,8 @@ abortit:
if (FAT32(pmp)) {
putushort(dotdotp->deHighClust,
dp->de_StartCluster >> 16);
} else {
putushort(dotdotp->deHighClust, 0);
}
if ((error = bwrite(bp)) != 0) {
/* XXX should really panic here, fs is corrupt */
@ -1255,6 +1257,9 @@ msdosfs_mkdir(v)
if (FAT32(pmp)) {
putushort(denp[0].deHighClust, newcluster >> 16);
putushort(denp[1].deHighClust, pdep->de_StartCluster >> 16);
} else {
putushort(denp[0].deHighClust, 0);
putushort(denp[1].deHighClust, 0);
}
if (async)