[NTOS:FSRTL]

- Rework FsRtlIsHpfsDbcsLegal is similar FsRtlIsFatDbcsLegal

* Fixes 30 tests for kmtest FsRtlLegal

svn path=/trunk/; revision=72542
This commit is contained in:
Dmitry Chapyshev 2016-09-03 10:47:21 +00:00
parent 44bb873f32
commit 006abaebe6

View file

@ -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;
} }