[FASTFAT]

In case we're performing an in-place move (ie, in the same directory), if short name matches before and after, keep it.

This avoids that a file with long file name sees its short name changing on normally 'non-effect' renames.
For instance, in case of case-change only rename, short name will now be preserved.

See ya, you 7y old bug :-)

CORE-3875 #resolve #comment Fixed with r71270

svn path=/trunk/; revision=71270
This commit is contained in:
Pierre Schweitzer 2016-05-06 21:06:31 +00:00
parent 38b36a3dc0
commit 3b58992913
2 changed files with 14 additions and 0 deletions

View file

@ -345,6 +345,18 @@ FATAddEntry(
{
break;
}
else if (MoveContext)
{
ASSERT(*Fcb);
if (strncmp((char *)SearchContext.DirEntry.Fat.ShortName, (char *)(*Fcb)->entry.Fat.ShortName, 11) == 0)
{
if (MoveContext->InPlace)
{
ASSERT(SearchContext.DirEntry.Fat.FileSize == MoveContext->FileSize);
break;
}
}
}
}
if (i == 100) /* FIXME : what to do after this ? */
{
@ -947,6 +959,7 @@ VfatMoveEntry(
OldParent = pFcb->parentFcb;
CcPurgeCacheSection(&OldParent->SectionObjectPointers, NULL, 0, FALSE);
MoveContext.InPlace = (OldParent == ParentFcb);
/* Add our new entry with our cluster */
Status = VfatAddEntry(DeviceExt,

View file

@ -488,6 +488,7 @@ typedef struct _VFAT_MOVE_CONTEXT
ULONG FileSize;
USHORT CreationDate;
USHORT CreationTime;
BOOLEAN InPlace;
} VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
FORCEINLINE