After r254627, the deupdate() started writing the directory entries to

disk.  That has a side effect of corrupting the "." entries names on
rename, since the call to createde() in the msdosfs_rename() sets the
de_Name to the target name.  If any change to the directory attributes
is performed, the wrong name is written back to the on-disk direntry
on update.

Overwrite the de_Name for the directories on rename to correct the dot
name.

Submitted by:	bde
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2014-05-03 16:11:55 +00:00
parent 42b097602d
commit 08cf5ceb8e
1 changed files with 11 additions and 0 deletions

View File

@ -1240,6 +1240,17 @@ abortit:
VOP_UNLOCK(fvp, 0);
goto bad;
}
/*
* If ip is for a directory, then its name should always
* be "." since it is for the directory entry in the
* directory itself (msdosfs_lookup() always translates
* to the "." entry so as to get a unique denode, except
* for the root directory there are different
* complications). However, we just corrupted its name
* to pass the correct name to createde(). Undo this.
*/
if ((ip->de_Attributes & ATTR_DIRECTORY) != 0)
bcopy(oldname, ip->de_Name, 11);
ip->de_refcnt++;
zp->de_fndoffset = from_diroffset;
error = removede(zp, ip);