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/environ.c?rev=54406&r1=54405&r2=54406&view=diff
==============================================================================
--- 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/loader.c?rev=54406&r1=54405&r2=54406&view=diff
==============================================================================
--- 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;


Reply via email to