Author: fireball
Date: Sat May 16 12:41:26 2009
New Revision: 40936
URL:
http://svn.reactos.org/svn/reactos?rev=40936&view=rev
Log:
- Fix obvious bugs in the code (e.g. freeing a stack-allocated pointer).
- Rewrite the code to be more readable.
- Enlarge static buffer for SearchPathBuffer to be at least 5*MAX_PATH to prevent possible
overflowing for now. In the meanwhile, Dmitry is rewriting this part of code to
dynamically allocate the memory without the need for a temporary static storage.
Modified:
trunk/reactos/dll/ntdll/ldr/utils.c
Modified: trunk/reactos/dll/ntdll/ldr/utils.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/ldr/utils.c?rev=…
==============================================================================
--- trunk/reactos/dll/ntdll/ldr/utils.c [iso-8859-1] (original)
+++ trunk/reactos/dll/ntdll/ldr/utils.c [iso-8859-1] Sat May 16 12:41:26 2009
@@ -185,19 +185,21 @@
{
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
OBJECT_ATTRIBUTES ObjectAttributes;
- WCHAR SearchPathBuffer[MAX_PATH];
+ WCHAR SearchPathBuffer[5*MAX_PATH];
UNICODE_STRING ValueNameString;
UNICODE_STRING KeyName;
- WCHAR NameBuffer[256];
+ WCHAR NameBuffer[MAX_PATH];
ULONG KeyInfoSize;
ULONG ResultSize;
- ULONG len;
+ PWCHAR Backslash;
HANDLE KeyHandle;
NTSTATUS Status;
PWSTR Path = NULL;
- swprintf(NameBuffer,
-
L"\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\App
Paths\\%s", ImageName);
+ _snwprintf(NameBuffer,
+ sizeof(NameBuffer) / sizeof(WCHAR),
+
L"\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\App
Paths\\%s",
+ ImageName);
RtlInitUnicodeString(&KeyName, NameBuffer);
@@ -236,48 +238,46 @@
KeyInfoSize,
&ResultSize);
- if (NT_SUCCESS(Status))
- {
- RtlCopyMemory(SearchPathBuffer,
- &KeyInfo->Data,
- KeyInfo->DataLength);
-
- /* get application running path */
- wcscat(SearchPathBuffer, L";");
- wcscat (SearchPathBuffer,
NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer);
-
- len = wcslen (SearchPathBuffer);
-
- while (len && SearchPathBuffer[len - 1] != L'\\')
- len--;
-
- if (len) SearchPathBuffer[len-1] = L'\0';
-
- wcscat (SearchPathBuffer, L";");
-
- wcscat (SearchPathBuffer, SharedUserData->NtSystemRoot);
- wcscat (SearchPathBuffer, L"\\system32;");
- wcscat (SearchPathBuffer, SharedUserData->NtSystemRoot);
- wcscat (SearchPathBuffer, L";.");
-
- Path = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- wcslen(SearchPathBuffer) * sizeof(WCHAR));
-
- if (Path == NULL)
- {
- DPRINT("RtlAllocateHeap() failed\n");
- RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
- NtClose(KeyHandle);
- return NULL;
- }
-
- Path = SearchPathBuffer;
- }
-
+ if (!NT_SUCCESS(Status))
+ return NULL;
+
+ RtlCopyMemory(SearchPathBuffer,
+ &KeyInfo->Data,
+ KeyInfo->DataLength);
+
+ /* Free KeyInfo memory, we won't need it anymore */
RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
+ /* Close the key handle */
NtClose(KeyHandle);
+
+ /* get application running path */
+ wcscat(SearchPathBuffer, L";");
+ wcscat(SearchPathBuffer,
NtCurrentPeb()->ProcessParameters->ImagePathName.Buffer); // FIXME: Don't rely
on it being NULL-terminated!!!
+
+ /* Remove trailing backslash */
+ Backslash = wcsrchr(SearchPathBuffer, L'\\');
+ if (Backslash) Backslash = L'\0';
+
+ wcscat(SearchPathBuffer, L";");
+
+ wcscat(SearchPathBuffer, SharedUserData->NtSystemRoot);
+ wcscat(SearchPathBuffer, L"\\system32;");
+ wcscat(SearchPathBuffer, SharedUserData->NtSystemRoot);
+ wcscat(SearchPathBuffer, L";.");
+
+ /* Copy it to the heap allocd memory */
+ Path = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ wcslen(SearchPathBuffer) * sizeof(WCHAR));
+
+ if (!Path)
+ {
+ DPRINT1("RtlAllocateHeap() failed\n");
+ return NULL;
+ }
+
+ wcscpy(Path, SearchPathBuffer);
return Path;
}