Author: dchapyshev
Date: Sat Sep 3 10:47:21 2016
New Revision: 72542
URL:
http://svn.reactos.org/svn/reactos?rev=72542&view=rev
Log:
[NTOS:FSRTL]
- Rework FsRtlIsHpfsDbcsLegal is similar FsRtlIsFatDbcsLegal
* Fixes 30 tests for kmtest FsRtlLegal
Modified:
trunk/reactos/ntoskrnl/fsrtl/dbcsname.c
Modified: trunk/reactos/ntoskrnl/fsrtl/dbcsname.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fsrtl/dbcsname.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] Sat Sep 3 10:47:21 2016
@@ -603,13 +603,27 @@
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
- ANSI_STRING FirstPart, RemainingPart, Name;
+ ANSI_STRING FirstPart, RemainingPart;
USHORT i;
PAGED_CODE();
/* Just quit if the string is empty */
if (!DbcsName.Length)
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 \ */
if (!LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
@@ -622,64 +636,56 @@
DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
}
- /* Extract first part of the DbcsName to work on */
- FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
- while (FirstPart.Length > 0)
- {
- /* Accept special filename if wildcards are allowed */
- if (WildCardsPermissible && (FirstPart.Length == 1 || FirstPart.Length ==
2) && FirstPart.Buffer[0] == '.')
- {
- if (FirstPart.Length == 2)
- {
- if (FirstPart.Buffer[1] == '.')
- {
- goto EndLoop;
- }
- }
- else
- {
- goto EndLoop;
- }
- }
-
- /* Filename must be 255 bytes maximum */
- if (FirstPart.Length > 255)
+ if (PathNamePermissible)
+ {
+ /* We copy the buffer for FsRtlDissectDbcs call */
+ RemainingPart.Buffer = DbcsName.Buffer;
+ RemainingPart.Length = DbcsName.Length;
+ RemainingPart.MaximumLength = DbcsName.MaximumLength;
+
+ while (RemainingPart.Length > 0)
+ {
+ if (RemainingPart.Buffer[0] == '\\')
+ return FALSE;
+
+ /* Call once again our dissect function */
+ FsRtlDissectDbcs(RemainingPart, &FirstPart, &RemainingPart);
+
+ if (!FsRtlIsHpfsDbcsLegal(FirstPart,
+ WildCardsPermissible,
+ FALSE,
+ FALSE))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ 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;
-
- /* 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 (FsRtlIsLeadDbcsCharacter(FirstPart.Buffer[i]))
- {
- if (i == (FirstPart.Length) - 1)
- return FALSE;
- i++;
- }
- /* Then check for bad characters */
- else if (!FsRtlIsAnsiCharacterLegalHpfs(FirstPart.Buffer[i],
WildCardsPermissible))
- {
- return FALSE;
- }
- }
-
+ }
/* Filename mustn't finish with a space or a dot */
- if ((FirstPart.Buffer[FirstPart.Length - 1] == ' ') ||
- (FirstPart.Buffer[FirstPart.Length - 1] == '.'))
+ else if ((DbcsName.Buffer[i] == ' ' || DbcsName.Buffer[i] == '.')
&& i == (DbcsName.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;
- }
+ }
+ }
+
return TRUE;
}