Author: tkreuzer Date: Sat Feb 16 18:46:36 2013 New Revision: 58324
URL: http://svn.reactos.org/svn/reactos?rev=58324&view=rev Log: [RTL] Fix RtlIsNameLegalDOS8Dot3 regression
Modified: trunk/reactos/lib/rtl/dos8dot3.c
Modified: trunk/reactos/lib/rtl/dos8dot3.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/dos8dot3.c?rev=5832... ============================================================================== --- trunk/reactos/lib/rtl/dos8dot3.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/dos8dot3.c [iso-8859-1] Sat Feb 16 18:46:36 2013 @@ -225,12 +225,18 @@
/* * @implemented + * Note: the function does not conform to the annotations. + * SpacesFound is not always set! */ +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ +NTSYSAPI BOOLEAN NTAPI -RtlIsNameLegalDOS8Dot3(IN PCUNICODE_STRING UnicodeName, - IN OUT POEM_STRING AnsiName OPTIONAL, - IN OUT PBOOLEAN SpacesFound OPTIONAL) +RtlIsNameLegalDOS8Dot3 ( + _In_ PCUNICODE_STRING Name, + _Inout_opt_ POEM_STRING OemName, + _Out_opt_ PBOOLEAN NameContainsSpaces) { static const char Illegal[] = "*?<>|"+=,;[]:/\\345"; int Dot = -1; @@ -240,36 +246,35 @@ BOOLEAN GotSpace = FALSE; NTSTATUS Status;
- if (SpacesFound) *SpacesFound = FALSE; - - if (!AnsiName) + if (!OemName) { OemString.Length = sizeof(Buffer); OemString.MaximumLength = sizeof(Buffer); OemString.Buffer = Buffer; - AnsiName = &OemString; - } - - Status = RtlUpcaseUnicodeStringToCountedOemString(AnsiName, UnicodeName, FALSE); + OemName = &OemString; + } + + Status = RtlUpcaseUnicodeStringToCountedOemString(OemName, Name, FALSE); if (!NT_SUCCESS(Status)) return FALSE;
- if ((AnsiName->Length > 12) || (AnsiName->Buffer == NULL)) return FALSE; + if ((OemName->Length > 12) || (OemName->Buffer == NULL)) return FALSE;
/* a starting . is invalid, except for . and .. */ - if (AnsiName->Buffer[0] == '.') - { - if (AnsiName->Length != 1 && (AnsiName->Length != 2 || AnsiName->Buffer[1] != '.')) return FALSE; + if (OemName->Buffer[0] == '.') + { + if (OemName->Length != 1 && (OemName->Length != 2 || OemName->Buffer[1] != '.')) return FALSE; + if (NameContainsSpaces) *NameContainsSpaces = FALSE; return TRUE; }
- for (i = 0; i < AnsiName->Length; i++) - { - switch (AnsiName->Buffer[i]) + for (i = 0; i < OemName->Length; i++) + { + switch (OemName->Buffer[i]) { case ' ': /* leading/trailing spaces not allowed */ - if (!i || i == AnsiName->Length-1 || AnsiName->Buffer[i+1] == '.') return FALSE; + if (!i || i == OemName->Length-1 || OemName->Buffer[i+1] == '.') return FALSE; GotSpace = TRUE; break; case '.': @@ -277,7 +282,7 @@ Dot = i; break; default: - if (strchr(Illegal, AnsiName->Buffer[i])) return FALSE; + if (strchr(Illegal, OemName->Buffer[i])) return FALSE; break; } } @@ -286,13 +291,13 @@ */ if (Dot == -1) { - if (AnsiName->Length > 8) return FALSE; + if (OemName->Length > 8) return FALSE; } else { - if (Dot > 8 || (AnsiName->Length - Dot > 4) || Dot == AnsiName->Length - 1) return FALSE; - } - if (SpacesFound) *SpacesFound = GotSpace; + if (Dot > 8 || (OemName->Length - Dot > 4) || Dot == OemName->Length - 1) return FALSE; + } + if (NameContainsSpaces) *NameContainsSpaces = GotSpace; return TRUE; }