[PATCH] kernel32: return copy of environment block in GetEnvironmentStringsW

Peter Beutner p.beutner at gmx.net
Sat Mar 31 14:14:25 CDT 2007


Make behaviour consistent with GetEnvironmentStringsA.
Prevents crash for confused applications which first call
GetEnvironmentStringsW and then want to free it with FreeEnvironmentStringsA.
(see bug #7794)
---
 dlls/kernel32/environ.c |   35 +++++++++++++++++++++++++++++++++--
 1 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/environ.c b/dlls/kernel32/environ.c
index 414ccbf..6e3e721 100644
--- a/dlls/kernel32/environ.c
+++ b/dlls/kernel32/environ.c
@@ -139,7 +139,38 @@ LPSTR WINAPI GetEnvironmentStringsA(void)
  */
 LPWSTR WINAPI GetEnvironmentStringsW(void)
 {
-    return NtCurrentTeb()->Peb->ProcessParameters->Environment;
+    LPWSTR      ptr, ret, dst;
+    unsigned    len, slen;
+
+    RtlAcquirePebLock();
+
+    len = 1;
+
+    ptr = NtCurrentTeb()->Peb->ProcessParameters->Environment;
+    while (*ptr)
+    {
+        slen = strlenW(ptr) + 1;
+        len += slen;
+        ptr += slen;
+    }
+
+    if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR))) != NULL)
+    {
+        dst = ret;
+        ptr = NtCurrentTeb()->Peb->ProcessParameters->Environment;
+        while (*ptr)
+        {
+            slen = strlenW(ptr) + 1;
+            memcpy(dst, ptr, slen * sizeof(WCHAR));
+            ptr += slen;
+            dst += slen;
+        }
+        *dst = 0;
+    }
+
+    RtlReleasePebLock();
+
+    return ret;
 }
 
 
@@ -157,7 +188,7 @@ BOOL WINAPI FreeEnvironmentStringsA( LPSTR ptr )
  */
 BOOL WINAPI FreeEnvironmentStringsW( LPWSTR ptr )
 {
-    return TRUE;
+    return HeapFree( GetProcessHeap(), 0, ptr );
 }
 
 
-- 
1.5.0.6




More information about the wine-patches mailing list