aboutsummaryrefslogtreecommitdiff
path: root/sys/fs
diff options
context:
space:
mode:
authorTim J. Robbins <tjr@FreeBSD.org>2004-09-08 11:25:41 +0000
committerTim J. Robbins <tjr@FreeBSD.org>2004-09-08 11:25:41 +0000
commit6a5bf04a5b1006f2850f2eb6705a59523933cc9f (patch)
tree4fb05fdd074a06c449c5b797950fa0b34c6d2440 /sys/fs
parentd23af19a71e0d8fa95e82478815ab4ad5ea3a14f (diff)
Notes
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/msdosfs/msdosfs_lookup.c21
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;
}