summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-02-13 12:41:07 +0000
committerkib <kib@FreeBSD.org>2010-02-13 12:41:07 +0000
commitb6bb83ada40bb7bb9c35cdb0f31f00e100932b8c (patch)
tree973912c4c40193e5f04c11eb23d2055f94128cb5 /sys/fs/msdosfs
parentb99a62d97c56f96defd88c87e44d3a4553b85cdf (diff)
downloadFreeBSD-src-b6bb83ada40bb7bb9c35cdb0f31f00e100932b8c.zip
FreeBSD-src-b6bb83ada40bb7bb9c35cdb0f31f00e100932b8c.tar.gz
- Add idempotency guards so the structures can be used in other utilities.
- Update bpb structs with reserved fields. - In direntry struct join deName with deExtension. Although a fix was attempted in the past, these fields were being overflowed, Now this is consistent with the spec, and we can now share the WinChksum code with NetBSD. Submitted by: Pedro F. Giffuni <giffunip tutopia com> Mostly obtained from: NetBSD Reviewed by: bde MFC after: 2 weeks
Diffstat (limited to 'sys/fs/msdosfs')
-rw-r--r--sys/fs/msdosfs/bootsect.h4
-rw-r--r--sys/fs/msdosfs/bpb.h8
-rw-r--r--sys/fs/msdosfs/direntry.h8
-rw-r--r--sys/fs/msdosfs/msdosfs_conv.c17
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c4
-rw-r--r--sys/fs/msdosfs/msdosfs_vnops.c6
6 files changed, 24 insertions, 23 deletions
diff --git a/sys/fs/msdosfs/bootsect.h b/sys/fs/msdosfs/bootsect.h
index 9e8aa97..ebd60a0 100644
--- a/sys/fs/msdosfs/bootsect.h
+++ b/sys/fs/msdosfs/bootsect.h
@@ -16,6 +16,8 @@
*
* October 1992
*/
+#ifndef _FS_MSDOSFS_BOOTSECT_H_
+#define _FS_MSDOSFS_BOOTSECT_H_
/*
* Format of a boot sector. This is the first sector on a DOS floppy disk
@@ -91,3 +93,5 @@ union bootsector {
#define bsHiddenSecs bsBPB.bpbHiddenSecs
#define bsHugeSectors bsBPB.bpbHugeSectors
#endif
+
+#endif /* !_FS_MSDOSFS_BOOTSECT_H_ */
diff --git a/sys/fs/msdosfs/bpb.h b/sys/fs/msdosfs/bpb.h
index addacd2..ce20f53 100644
--- a/sys/fs/msdosfs/bpb.h
+++ b/sys/fs/msdosfs/bpb.h
@@ -17,6 +17,9 @@
* October 1992
*/
+#ifndef _FS_MSDOSFS_BPB_H_
+#define _FS_MSDOSFS_BPB_H_
+
/*
* BIOS Parameter Block (BPB) for DOS 3.3
*/
@@ -78,7 +81,7 @@ struct bpb710 {
u_int32_t bpbRootClust; /* start cluster for root directory */
u_int16_t bpbFSInfo; /* filesystem info structure sector */
u_int16_t bpbBackup; /* backup boot sector */
- /* There is a 12 byte filler here, but we ignore it */
+ u_int8_t bpbReserved[12]; /* reserved for future expansion */
};
/*
@@ -153,7 +156,7 @@ struct byte_bpb710 {
u_int8_t bpbRootClust[4]; /* start cluster for root directory */
u_int8_t bpbFSInfo[2]; /* filesystem info structure sector */
u_int8_t bpbBackup[2]; /* backup boot sector */
- /* There is a 12 byte filler here, but we ignore it */
+ u_int8_t bpbReserved[12]; /* reserved for future expansion */
};
/*
@@ -168,3 +171,4 @@ struct fsinfo {
u_int8_t fsifill2[12];
u_int8_t fsisig3[4];
};
+#endif /* !_FS_MSDOSFS_BPB_H_ */
diff --git a/sys/fs/msdosfs/direntry.h b/sys/fs/msdosfs/direntry.h
index a55b0af..86b6fbb 100644
--- a/sys/fs/msdosfs/direntry.h
+++ b/sys/fs/msdosfs/direntry.h
@@ -47,16 +47,17 @@
*
* October 1992
*/
+#ifndef _FS_MSDOSFS_DIRENTRY_H_
+#define _FS_MSDOSFS_DIRENTRY_H_
/*
* Structure of a dos directory entry.
*/
struct direntry {
- u_int8_t deName[8]; /* filename, blank filled */
+ u_int8_t deName[11]; /* filename, blank filled */
#define SLOT_EMPTY 0x00 /* slot has never been used */
#define SLOT_E5 0x05 /* the real value is 0xe5 */
#define SLOT_DELETED 0xe5 /* file in this slot deleted */
- u_int8_t deExtension[3]; /* extension, blank filled */
u_int8_t deAttributes; /* file attributes */
#define ATTR_NORMAL 0x00 /* normal file */
#define ATTR_READONLY 0x01 /* file is readonly */
@@ -155,7 +156,8 @@ int winChkName(struct mbnambuf *nbp, const u_char *un, size_t unlen,
int chksum, struct msdosfsmount *pmp);
int win2unixfn(struct mbnambuf *nbp, struct winentry *wep, int chksum,
struct msdosfsmount *pmp);
-u_int8_t winChksum(struct direntry *dep);
+u_int8_t winChksum(u_int8_t *name);
int winSlotCnt(const u_char *un, size_t unlen, struct msdosfsmount *pmp);
size_t winLenFixup(const u_char *un, size_t unlen);
#endif /* _KERNEL */
+#endif /* !_FS_MSDOSFS_DIRENTRY_H_ */
diff --git a/sys/fs/msdosfs/msdosfs_conv.c b/sys/fs/msdosfs/msdosfs_conv.c
index 50dc1a0..8dc1d07 100644
--- a/sys/fs/msdosfs/msdosfs_conv.c
+++ b/sys/fs/msdosfs/msdosfs_conv.c
@@ -741,22 +741,13 @@ win2unixfn(nbp, wep, chksum, pmp)
* Compute the unrolled checksum of a DOS filename for Win95 LFN use.
*/
u_int8_t
-winChksum(struct direntry *dep)
+winChksum(u_int8_t *name)
{
+ int i;
u_int8_t s;
- s = dep->deName[0];
- s = ((s << 7) | (s >> 1)) + dep->deName[1];
- s = ((s << 7) | (s >> 1)) + dep->deName[2];
- s = ((s << 7) | (s >> 1)) + dep->deName[3];
- s = ((s << 7) | (s >> 1)) + dep->deName[4];
- s = ((s << 7) | (s >> 1)) + dep->deName[5];
- s = ((s << 7) | (s >> 1)) + dep->deName[6];
- s = ((s << 7) | (s >> 1)) + dep->deName[7];
- s = ((s << 7) | (s >> 1)) + dep->deExtension[0];
- s = ((s << 7) | (s >> 1)) + dep->deExtension[1];
- s = ((s << 7) | (s >> 1)) + dep->deExtension[2];
-
+ for (s = 0, i = 11; --i >= 0; s += *name++)
+ s = (s << 7)|(s >> 1);
return (s);
}
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c
index 1344f628e..8e0c3d5 100644
--- a/sys/fs/msdosfs/msdosfs_lookup.c
+++ b/sys/fs/msdosfs/msdosfs_lookup.c
@@ -276,7 +276,7 @@ msdosfs_lookup(ap)
/*
* Check for a checksum or name match
*/
- chksum_ok = (chksum == winChksum(dep));
+ chksum_ok = (chksum == winChksum(dep->deName));
if (!chksum_ok
&& (!olddos || bcmp(dosfilename, dep->deName, 11))) {
chksum = -1;
@@ -617,7 +617,7 @@ createde(dep, ddep, depp, cnp)
* Now write the Win95 long name
*/
if (ddep->de_fndcnt > 0) {
- u_int8_t chksum = winChksum(ndep);
+ u_int8_t chksum = winChksum(ndep->deName);
const u_char *un = (const u_char *)cnp->cn_nameptr;
int unlen = cnp->cn_namelen;
int cnt = 1;
diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c
index e62af02..e232f49 100644
--- a/sys/fs/msdosfs/msdosfs_vnops.c
+++ b/sys/fs/msdosfs/msdosfs_vnops.c
@@ -1287,7 +1287,7 @@ static struct {
struct direntry dot;
struct direntry dotdot;
} dosdirtemplate = {
- { ". ", " ", /* the . entry */
+ { ". ", /* the . entry */
ATTR_DIRECTORY, /* file attribute */
0, /* reserved */
0, { 0, 0 }, { 0, 0 }, /* create time & date */
@@ -1297,7 +1297,7 @@ static struct {
{ 0, 0 }, /* startcluster */
{ 0, 0, 0, 0 } /* filesize */
},
- { ".. ", " ", /* the .. entry */
+ { ".. ", /* the .. entry */
ATTR_DIRECTORY, /* file attribute */
0, /* reserved */
0, { 0, 0 }, { 0, 0 }, /* create time & date */
@@ -1729,7 +1729,7 @@ msdosfs_readdir(ap)
} else
dirbuf.d_fileno = (uint32_t)fileno;
- if (chksum != winChksum(dentp)) {
+ if (chksum != winChksum(dentp->deName)) {
dirbuf.d_namlen = dos2unixfn(dentp->deName,
(u_char *)dirbuf.d_name,
dentp->deLowerCase |
OpenPOWER on IntegriCloud