Pierre Schweitzer

- Implemented CdfsIsNameLegalDOS8Dot3 and use it to check filenames. It avoids
calling Rtl* functions that need NLS. (Modified merge of 35501).
See issue #2404 for more details.

svn path=/trunk/; revision=48486
This commit is contained in:
Aleksey Bragin 2010-08-08 08:24:19 +00:00
parent 7dc11f26bf
commit 1dac3daaa1

View file

@ -95,6 +95,40 @@ CdfsFileFlagsToAttributes(PFCB Fcb,
((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0); ((Fcb->Entry.FileFlags & FILE_FLAG_READONLY) ? FILE_ATTRIBUTE_READONLY : 0);
} }
BOOLEAN
CdfsIsNameLegalDOS8Dot3(IN PUNICODE_STRING FileName
)
{
ULONG i;
STRING DbcsName;
CHAR DbcsNameBuffer[12];
for (i = 0; i < FileName->Length / sizeof(WCHAR) ; i++)
{
/* Don't allow spaces in FileName */
if (FileName->Buffer[i] == L' ')
return FALSE;
}
#if 0
/* If FileName is finishing with a dot, remove it */
if (FileName->Buffer[FileName->Length / sizeof(WCHAR) - 1] == '.')
{
FileName->Length -= sizeof(WCHAR);
}
#endif
/* Finally, convert the string to call the FsRtl function */
DbcsName.MaximumLength = 12;
DbcsName.Buffer = DbcsNameBuffer;
if (!NT_SUCCESS(RtlUnicodeStringToCountedOemString(&DbcsName,
FileName,
FALSE )))
{
return FALSE;
}
return FsRtlIsFatDbcsLegal(DbcsName, FALSE, FALSE, FALSE);
}
VOID VOID
CdfsShortNameCacheGet CdfsShortNameCacheGet
(PFCB DirectoryFcb, (PFCB DirectoryFcb,
@ -102,7 +136,6 @@ CdfsShortNameCacheGet
PUNICODE_STRING LongName, PUNICODE_STRING LongName,
PUNICODE_STRING ShortName) PUNICODE_STRING ShortName)
{ {
BOOLEAN HasSpaces;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
PCDFS_SHORT_NAME ShortNameEntry; PCDFS_SHORT_NAME ShortNameEntry;
GENERATE_NAME_CONTEXT Context = { 0 }; GENERATE_NAME_CONTEXT Context = { 0 };
@ -132,8 +165,7 @@ CdfsShortNameCacheGet
} }
/* Cache miss */ /* Cache miss */
if ((RtlIsNameLegalDOS8Dot3(LongName, NULL, &HasSpaces) == FALSE) || if (!CdfsIsNameLegalDOS8Dot3(LongName))
(HasSpaces == TRUE))
{ {
RtlGenerate8dot3Name(LongName, FALSE, &Context, ShortName); RtlGenerate8dot3Name(LongName, FALSE, &Context, ShortName);
} }