Author: dchapyshev
Date: Sat Sep 3 00:37:51 2016
New Revision: 72539
URL: http://svn.reactos.org/svn/reactos?rev=72539&view=rev
Log:
[NTOS:FSRTL]
- The order of operations is changed
- Added check on availability of a '.' with a length of name of 8 and more characters (In 8.3 filename has to be a '.')
- Lead DBCS cannot precede the end of a filename
* Fixes 90 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 00:37:51 2016
@@ -431,7 +431,7 @@
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible)
{
- ANSI_STRING FirstPart, RemainingPart, Name;
+ ANSI_STRING FirstPart, RemainingPart;
BOOLEAN LastDot;
USHORT i;
PAGED_CODE();
@@ -439,6 +439,20 @@
/* 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] == '\\')
@@ -451,88 +465,108 @@
DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
}
- /* Extract first part of the DbcsName to work on */
- FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
- while (FirstPart.Length > 0)
- {
- /* Reset dots count */
- LastDot = FALSE;
-
- /* 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 8.3 filename */
- if (FirstPart.Length > 12)
+ 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 (!FsRtlIsFatDbcsLegal(FirstPart,
+ WildCardsPermissible,
+ FALSE,
+ FALSE))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ if (WildCardsPermissible && FsRtlDoesDbcsContainWildCards(&DbcsName))
+ {
+ for (i = 0; i < DbcsName.Length; i++)
+ {
+ /* First make sure the character it's not the Lead DBCS */
+ if (FsRtlIsLeadDbcsCharacter(DbcsName.Buffer[i]))
+ {
+ i++;
+ }
+ /* Then check for bad characters */
+ else if (!FsRtlIsAnsiCharacterLegalFat(DbcsName.Buffer[i], TRUE))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+ }
+
+ /* Filename must be 8.3 filename */
+ if (DbcsName.Length > 12)
+ return FALSE;
+
+ /* Reset dots count */
+ LastDot = 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 (!LastDot && (i >= 7))
+ return FALSE;
+
+ if (i == (DbcsName.Length - 1))
+ return FALSE;
+
+ i++;
+ continue;
+ }
+ /* Then check for bad characters */
+ else if (!FsRtlIsAnsiCharacterLegalFat(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 (!FsRtlIsAnsiCharacterLegalFat(FirstPart.Buffer[i], WildCardsPermissible))
- {
- return FALSE;
- }
- else if (FirstPart.Buffer[i] == '.')
- {
- /* Filename can only contain one dot */
- if (LastDot)
- return FALSE;
-
- LastDot = TRUE;
-
- /* We mustn't have spaces before dot or at the end of the filename
- * and no dot at the beginning of the filename */
- if ((i == (FirstPart.Length) - 1) || i == 0)
- return FALSE;
-
- if (i > 0)
- if (FirstPart.Buffer[i - 1] == ' ')
- return FALSE;
-
- /* Filename must be 8.3 filename and not 3.8 filename */
- if ((FirstPart.Length - 1) - i > 3)
- return FALSE;
- }
- }
-
+ }
+ else if (DbcsName.Buffer[i] == '.')
+ {
+ /* Filename can only contain one dot */
+ if (LastDot)
+ return FALSE;
+
+ LastDot = TRUE;
+
+ /* We mustn't have spaces before dot or at the end of the filename
+ * and no dot at the beginning of the filename */
+ if (i == (DbcsName.Length - 1) || i == 0)
+ return FALSE;
+
+ /* Filename must be 8.3 filename and not 3.8 filename */
+ if ((DbcsName.Length - 1) - i > 3)
+ return FALSE;
+
+ if ((i > 0) && DbcsName.Buffer[i - 1] == ' ')
+ return FALSE;
+ }
/* Filename mustn't finish with a space */
- if (FirstPart.Buffer[FirstPart.Length - 1] == ' ')
+ else if (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)
+ }
+
+ if (!LastDot && (i >= 8))
return FALSE;
}
+
return TRUE;
}