mirror of
https://github.com/reactos/reactos.git
synced 2025-05-07 18:56:48 +00:00
[NTOS:FSRTL]
- Rework FsRtlIsHpfsDbcsLegal is similar FsRtlIsFatDbcsLegal * Fixes 30 tests for kmtest FsRtlLegal svn path=/trunk/; revision=72542
This commit is contained in:
parent
44bb873f32
commit
006abaebe6
1 changed files with 57 additions and 51 deletions
|
@ -603,7 +603,7 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
|
||||||
IN BOOLEAN PathNamePermissible,
|
IN BOOLEAN PathNamePermissible,
|
||||||
IN BOOLEAN LeadingBackslashPermissible)
|
IN BOOLEAN LeadingBackslashPermissible)
|
||||||
{
|
{
|
||||||
ANSI_STRING FirstPart, RemainingPart, Name;
|
ANSI_STRING FirstPart, RemainingPart;
|
||||||
USHORT i;
|
USHORT i;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
|
@ -611,6 +611,20 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
|
||||||
if (!DbcsName.Length)
|
if (!DbcsName.Length)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
/* Accept special filename if wildcards are allowed */
|
||||||
|
if (WildCardsPermissible && (DbcsName.Length == 1 || DbcsName.Length == 2) && DbcsName.Buffer[0] == '.')
|
||||||
|
{
|
||||||
|
if (DbcsName.Length == 2)
|
||||||
|
{
|
||||||
|
if (DbcsName.Buffer[1] == '.')
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* DbcsName wasn't supposed to be started with \ */
|
/* DbcsName wasn't supposed to be started with \ */
|
||||||
if (!LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
|
if (!LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -622,64 +636,56 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
|
||||||
DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
|
DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Extract first part of the DbcsName to work on */
|
if (PathNamePermissible)
|
||||||
FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
|
|
||||||
while (FirstPart.Length > 0)
|
|
||||||
{
|
{
|
||||||
/* Accept special filename if wildcards are allowed */
|
/* We copy the buffer for FsRtlDissectDbcs call */
|
||||||
if (WildCardsPermissible && (FirstPart.Length == 1 || FirstPart.Length == 2) && FirstPart.Buffer[0] == '.')
|
RemainingPart.Buffer = DbcsName.Buffer;
|
||||||
{
|
RemainingPart.Length = DbcsName.Length;
|
||||||
if (FirstPart.Length == 2)
|
RemainingPart.MaximumLength = DbcsName.MaximumLength;
|
||||||
{
|
|
||||||
if (FirstPart.Buffer[1] == '.')
|
|
||||||
{
|
|
||||||
goto EndLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
goto EndLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Filename must be 255 bytes maximum */
|
while (RemainingPart.Length > 0)
|
||||||
if (FirstPart.Length > 255)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* Now, we will parse the filename to find everything bad in */
|
|
||||||
for (i = 0; i < FirstPart.Length; i++)
|
|
||||||
{
|
{
|
||||||
/* First make sure the character it's not the Lead DBCS */
|
if (RemainingPart.Buffer[0] == '\\')
|
||||||
if (FsRtlIsLeadDbcsCharacter(FirstPart.Buffer[i]))
|
return FALSE;
|
||||||
{
|
|
||||||
if (i == (FirstPart.Length) - 1)
|
/* Call once again our dissect function */
|
||||||
return FALSE;
|
FsRtlDissectDbcs(RemainingPart, &FirstPart, &RemainingPart);
|
||||||
i++;
|
|
||||||
}
|
if (!FsRtlIsHpfsDbcsLegal(FirstPart,
|
||||||
/* Then check for bad characters */
|
WildCardsPermissible,
|
||||||
else if (!FsRtlIsAnsiCharacterLegalHpfs(FirstPart.Buffer[i], WildCardsPermissible))
|
FALSE,
|
||||||
|
FALSE))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Filename mustn't finish with a space or a dot */
|
return TRUE;
|
||||||
if ((FirstPart.Buffer[FirstPart.Length - 1] == ' ') ||
|
|
||||||
(FirstPart.Buffer[FirstPart.Length - 1] == '.'))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
EndLoop:
|
|
||||||
/* Preparing next loop */
|
|
||||||
Name.Buffer = RemainingPart.Buffer;
|
|
||||||
Name.Length = RemainingPart.Length;
|
|
||||||
Name.MaximumLength = RemainingPart.MaximumLength;
|
|
||||||
|
|
||||||
/* Call once again our dissect function */
|
|
||||||
FsRtlDissectDbcs(Name, &FirstPart, &RemainingPart);
|
|
||||||
|
|
||||||
/* We found a pathname, it wasn't allowed */
|
|
||||||
if (FirstPart.Length > 0 && !PathNamePermissible)
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DbcsName.Length > 255)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
for (i = 0; i < DbcsName.Length; i++)
|
||||||
|
{
|
||||||
|
/* First make sure the character it's not the Lead DBCS */
|
||||||
|
if (FsRtlIsLeadDbcsCharacter(DbcsName.Buffer[i]))
|
||||||
|
{
|
||||||
|
if (i == (DbcsName.Length - 1))
|
||||||
|
return FALSE;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
/* Then check for bad characters */
|
||||||
|
else if (!FsRtlIsAnsiCharacterLegalHpfs(DbcsName.Buffer[i], WildCardsPermissible))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* Filename mustn't finish with a space or a dot */
|
||||||
|
else if ((DbcsName.Buffer[i] == ' ' || DbcsName.Buffer[i] == '.') && i == (DbcsName.Length - 1))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue