diff options
| author | Tim J. Robbins <tjr@FreeBSD.org> | 2004-09-08 11:25:41 +0000 |
|---|---|---|
| committer | Tim J. Robbins <tjr@FreeBSD.org> | 2004-09-08 11:25:41 +0000 |
| commit | 6a5bf04a5b1006f2850f2eb6705a59523933cc9f (patch) | |
| tree | 4fb05fdd074a06c449c5b797950fa0b34c6d2440 /sys/fs | |
| parent | d23af19a71e0d8fa95e82478815ab4ad5ea3a14f (diff) | |
Notes
Diffstat (limited to 'sys/fs')
| -rw-r--r-- | sys/fs/msdosfs/msdosfs_lookup.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/sys/fs/msdosfs/msdosfs_lookup.c b/sys/fs/msdosfs/msdosfs_lookup.c index 14920981790a1..446f0b214275c 100644 --- a/sys/fs/msdosfs/msdosfs_lookup.c +++ b/sys/fs/msdosfs/msdosfs_lookup.c @@ -114,7 +114,7 @@ msdosfs_lookup(ap) int unlen; int wincnt = 1; - int chksum = -1; + int chksum = -1, chksum_ok; int olddos = 1; cnp->cn_flags &= ~PDIRUNLOCK; @@ -283,7 +283,8 @@ msdosfs_lookup(ap) /* * Check for a checksum or name match */ - if (chksum != winChksum(dep->deName) + chksum_ok = (chksum == winChksum(dep->deName)); + if (!chksum_ok && (!olddos || bcmp(dosfilename, dep->deName, 11))) { chksum = -1; continue; @@ -298,7 +299,21 @@ msdosfs_lookup(ap) * this lookup. */ dp->de_fndoffset = diroff; - dp->de_fndcnt = wincnt - 1; + if (chksum_ok && nameiop == RENAME) { + /* + * Target had correct long name + * directory entries, reuse them + * as needed. + */ + dp->de_fndcnt = wincnt - 1; + } else { + /* + * Long name directory entries + * not present or corrupt, can only + * reuse dos directory entry. + */ + dp->de_fndcnt = 0; + } goto found; } |
