Author: rharabien
Date: Thu Nov 17 16:44:51 2011
New Revision: 54406
URL:
http://svn.reactos.org/svn/reactos?rev=54406&view=rev
Log:
[KERNEL32]
- Make sure GetEnvironmentVariableW does not use uninitialized variable
- Fix GetDllLoadPath not terminating string with NULL if PATH env variable is not defined.
Fixes hang on manual INF selection in New Device wizard.
See issue #6480 for more details.
Modified:
trunk/reactos/dll/win32/kernel32/client/environ.c
trunk/reactos/dll/win32/kernel32/client/loader.c
Modified: trunk/reactos/dll/win32/kernel32/client/environ.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/environ.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/client/environ.c [iso-8859-1] Thu Nov 17 16:44:51
2011
@@ -182,11 +182,10 @@
UniSize = UNICODE_STRING_MAX_BYTES - sizeof(UNICODE_NULL);
}
+ RtlInitEmptyUnicodeString(&VarValue, lpBuffer, UniSize);
Status = RtlInitUnicodeStringEx(&VarName, lpName);
if (NT_SUCCESS(Status))
{
- RtlInitEmptyUnicodeString(&VarValue, lpBuffer, UniSize);
-
Status = RtlQueryEnvironmentVariable_U(NULL, &VarName, &VarValue);
if (!NT_SUCCESS(Status))
{
Modified: trunk/reactos/dll/win32/kernel32/client/loader.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/loader.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/client/loader.c [iso-8859-1] Thu Nov 17 16:44:51
2011
@@ -80,7 +80,7 @@
LPWSTR
GetDllLoadPath(LPCWSTR lpModule)
{
- ULONG Pos = 0, Length = 0;
+ ULONG Pos = 0, Length = 4, Tmp;
PWCHAR EnvironmentBufferW = NULL;
LPCWSTR lpModuleEnd = NULL;
UNICODE_STRING ModuleName;
@@ -88,7 +88,7 @@
// FIXME: This function is used only by SearchPathW, and is deprecated and will be
deleted ASAP.
- if ((lpModule != NULL) && (wcslen(lpModule) > 2) && (lpModule[1] ==
':'))
+ if (lpModule != NULL && wcslen(lpModule) > 2 && lpModule[1] ==
':')
{
lpModuleEnd = lpModule + wcslen(lpModule);
}
@@ -116,10 +116,10 @@
Length += GetEnvironmentVariableW(L"PATH", NULL, 0);
EnvironmentBufferW = RtlAllocateHeap(RtlGetProcessHeap(), 0,
- Length * sizeof(WCHAR));
+ (Length + 1) * sizeof(WCHAR));
if (EnvironmentBufferW == NULL)
{
- return NULL;
+ return NULL;
}
if (lpModule)
@@ -130,15 +130,39 @@
EnvironmentBufferW[Pos++] = L';';
}
- Pos += GetCurrentDirectoryW(Length, EnvironmentBufferW + Pos);
- EnvironmentBufferW[Pos++] = L';';
- Pos += GetDllDirectoryW(Length - Pos, EnvironmentBufferW + Pos);
- EnvironmentBufferW[Pos++] = L';';
- Pos += GetSystemDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
- EnvironmentBufferW[Pos++] = L';';
- Pos += GetWindowsDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
- EnvironmentBufferW[Pos++] = L';';
- Pos += GetEnvironmentVariableW(L"PATH", EnvironmentBufferW + Pos, Length -
Pos);
+ Tmp = GetCurrentDirectoryW(Length, EnvironmentBufferW + Pos);
+ if(Tmp > 0 && Tmp < Length - Pos)
+ {
+ Pos += Tmp;
+ if(Pos < Length) EnvironmentBufferW[Pos++] = L';';
+ }
+
+ Tmp = GetDllDirectoryW(Length - Pos, EnvironmentBufferW + Pos);
+ if(Tmp > 0 && Tmp < Length - Pos)
+ {
+ Pos += Tmp;
+ if(Pos < Length) EnvironmentBufferW[Pos++] = L';';
+ }
+
+ Tmp = GetSystemDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
+ if(Tmp > 0 && Tmp < Length - Pos)
+ {
+ Pos += Tmp;
+ if(Pos < Length) EnvironmentBufferW[Pos++] = L';';
+ }
+
+ Tmp = GetWindowsDirectoryW(EnvironmentBufferW + Pos, Length - Pos);
+ if(Tmp > 0 && Tmp < Length - Pos)
+ {
+ Pos += Tmp;
+ if(Pos < Length) EnvironmentBufferW[Pos++] = L';';
+ }
+
+ Tmp = GetEnvironmentVariableW(L"PATH", EnvironmentBufferW + Pos, Length -
Pos);
+
+ /* Make sure buffer is null terminated */
+ EnvironmentBufferW[Pos++] = UNICODE_NULL;
+
SetLastError(LastError);
return EnvironmentBufferW;