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/e... ============================================================================== --- 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/l... ============================================================================== --- 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;