[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