From 6e8c79e64d65506fddc377c772d9b890b2fa1ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 13 Sep 2013 22:27:41 +0000 Subject: [PATCH] [KERNEL32] - npipe.c: * Use RtlPrefixUnicodeString instead of RtlPrefixString with casts. * Check results of RtlCreateUnicodeString and RtlPrefixUnicodeString, return FALSE if they fail and set an appropriate last error. * Free the string created with RtlCreateUnicodeString instead of leaking memory. * Fix a path type check (RtlPathTypeUncAbsolute instead of RtlPathTypeRootLocalDevice). - path.c: I prefer seeing the default case at the end of the switch (no functional changes). [NTOS:MM] - Use RtlPrefixUnicodeString instead of RtlPrefixString with casts. [RTL] - RtlPrefixString acts on general PSTRINGs (which are not UNICODE). - Remove extra spaces between names of functions and parentheses. - Clarify the fact that we run over characters. svn path=/trunk/; revision=60085 --- .../dll/win32/kernel32/client/file/npipe.c | 26 ++++++++++++++----- reactos/dll/win32/kernel32/client/path.c | 25 +++++++++--------- reactos/include/ndk/rtlfuncs.h | 4 +-- reactos/lib/rtl/unicode.c | 22 +++++++++------- reactos/ntoskrnl/mm/ARM3/sysldr.c | 6 ++--- 5 files changed, 50 insertions(+), 33 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/file/npipe.c b/reactos/dll/win32/kernel32/client/file/npipe.c index 4e33fc6939f..9345333aa5e 100644 --- a/reactos/dll/win32/kernel32/client/file/npipe.c +++ b/reactos/dll/win32/kernel32/client/file/npipe.c @@ -382,7 +382,11 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, /* Start by making a unicode string of the name */ TRACE("Sent path: %S\n", lpNamedPipeName); - RtlCreateUnicodeString(&NamedPipeName, lpNamedPipeName); + if (!RtlCreateUnicodeString(&NamedPipeName, lpNamedPipeName)) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } NameLength = NamedPipeName.Length / sizeof(WCHAR); /* All slashes must become backslashes */ @@ -401,7 +405,14 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, { /* Make sure it's a valid prefix */ RtlInitUnicodeString(&PipePrefix, L"\\\\.\\pipe\\"); - RtlPrefixString((PANSI_STRING)&PipePrefix, (PANSI_STRING)&NewName, TRUE); + if (!RtlPrefixUnicodeString(&PipePrefix, &NewName, TRUE)) + { + /* The name is invalid */ + WARN("Invalid name!\n"); + RtlFreeUnicodeString(&NamedPipeName); + BaseSetLastNTError(STATUS_OBJECT_PATH_SYNTAX_BAD); + return FALSE; + } /* Move past it */ NewName.Buffer += 9; @@ -411,7 +422,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, TRACE("NewName: %wZ\n", &NewName); RtlInitUnicodeString(&DevicePath, L"\\DosDevices\\pipe\\"); } - else if (Type == RtlPathTypeRootLocalDevice) + else if (Type == RtlPathTypeUncAbsolute) { /* The path is \\server\\pipe\name; find the pipename itself */ p = &NewName.Buffer[2]; @@ -436,6 +447,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, { /* The name is invalid */ WARN("Invalid name!\n"); + RtlFreeUnicodeString(&NamedPipeName); BaseSetLastNTError(STATUS_OBJECT_PATH_SYNTAX_BAD); return FALSE; } @@ -445,6 +457,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, else { WARN("Invalid path type\n"); + RtlFreeUnicodeString(&NamedPipeName); BaseSetLastNTError(STATUS_OBJECT_PATH_SYNTAX_BAD); return FALSE; } @@ -455,6 +468,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, WaitPipeInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, WaitPipeInfoSize); if (WaitPipeInfo == NULL) { + RtlFreeUnicodeString(&NamedPipeName); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } @@ -478,9 +492,9 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, { /* Fail; couldn't open */ WARN("Status: %lx\n", Status); - BaseSetLastNTError(Status); - RtlFreeUnicodeString(&NamedPipeName); RtlFreeHeap(RtlGetProcessHeap(), 0, WaitPipeInfo); + RtlFreeUnicodeString(&NamedPipeName); + BaseSetLastNTError(Status); return FALSE; } @@ -537,7 +551,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName, { /* Failure to wait on the pipe */ WARN("Status: %lx\n", Status); - BaseSetLastNTError (Status); + BaseSetLastNTError(Status); return FALSE; } diff --git a/reactos/dll/win32/kernel32/client/path.c b/reactos/dll/win32/kernel32/client/path.c index ced7006b161..b2d0d795c32 100644 --- a/reactos/dll/win32/kernel32/client/path.c +++ b/reactos/dll/win32/kernel32/client/path.c @@ -740,6 +740,19 @@ SkipPathTypeIndicator_U(IN LPWSTR Path) /* Check what kind of path this is and how many slashes to skip */ switch (RtlDetermineDosPathNameType_U(Path)) { + case RtlPathTypeUncAbsolute: + case RtlPathTypeLocalDevice: + { + /* Keep going until we bypass the path indicators */ + for (ReturnPath = Path + 2, i = 2; (i > 0) && (*ReturnPath); ReturnPath++) + { + /* We look for 2 slashes, so keep at it until we find them */ + if ((*ReturnPath == L'\\') || (*ReturnPath == L'/')) i--; + } + + return ReturnPath; + } + case RtlPathTypeDriveAbsolute: return Path + 3; @@ -755,18 +768,6 @@ SkipPathTypeIndicator_U(IN LPWSTR Path) case RtlPathTypeRootLocalDevice: default: return NULL; - - case RtlPathTypeUncAbsolute: - case RtlPathTypeLocalDevice: - - /* Keep going until we bypass the path indicators */ - for (ReturnPath = Path + 2, i = 2; (i > 0) && (*ReturnPath); ReturnPath++) - { - /* We look for 2 slashes, so keep at it until we find them */ - if ((*ReturnPath == L'\\') || (*ReturnPath == L'/')) i--; - } - - return ReturnPath; } } diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index c18303d1cd4..1ed755d909b 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -2165,8 +2165,8 @@ NTSYSAPI BOOLEAN NTAPI RtlPrefixString( - PCANSI_STRING String1, - PCANSI_STRING String2, + PSTRING String1, + PSTRING String2, BOOLEAN CaseInsensitive ); diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index c38b3fe5592..8913df64079 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -835,17 +835,18 @@ RtlInt64ToUnicodeString ( BOOLEAN NTAPI RtlPrefixString( - PANSI_STRING String1, - PANSI_STRING String2, - BOOLEAN CaseInsensitive) + PSTRING String1, + PSTRING String2, + BOOLEAN CaseInsensitive) { PCHAR pc1; PCHAR pc2; - ULONG Length; + ULONG NumChars; - if (String2->Length < String1->Length) return FALSE; + if (String2->Length < String1->Length) + return FALSE; - Length = String1->Length; + NumChars = String1->Length; pc1 = String1->Buffer; pc2 = String2->Buffer; @@ -853,15 +854,15 @@ RtlPrefixString( { if (CaseInsensitive) { - while (Length--) + while (NumChars--) { - if (RtlUpperChar (*pc1++) != RtlUpperChar (*pc2++)) + if (RtlUpperChar(*pc1++) != RtlUpperChar(*pc2++)) return FALSE; } } else { - while (Length--) + while (NumChars--) { if (*pc1++ != *pc2++) return FALSE; @@ -889,7 +890,7 @@ RtlPrefixUnicodeString( { PWCHAR pc1; PWCHAR pc2; - ULONG NumChars; + ULONG NumChars; if (String2->Length < String1->Length) return FALSE; @@ -923,6 +924,7 @@ RtlPrefixUnicodeString( return FALSE; } + /* * @implemented */ diff --git a/reactos/ntoskrnl/mm/ARM3/sysldr.c b/reactos/ntoskrnl/mm/ARM3/sysldr.c index 34db61d8208..2afaae6c725 100644 --- a/reactos/ntoskrnl/mm/ARM3/sysldr.c +++ b/reactos/ntoskrnl/mm/ARM3/sysldr.c @@ -827,9 +827,9 @@ MiSnapThunk(IN PVOID DllBase, InLoadOrderLinks); /* Check if it matches */ - if (RtlPrefixString((PSTRING)&ForwarderName, - (PSTRING)&LdrEntry->BaseDllName, - TRUE)) + if (RtlPrefixUnicodeString(&ForwarderName, + &LdrEntry->BaseDllName, + TRUE)) { /* Get the forwarder export directory */ ForwardExportDirectory =