From 91a9ecefb6d7f066c6eecc09f7231ce7969d1817 Mon Sep 17 00:00:00 2001 From: Zhi Hui Li Date: Thu, 24 Nov 2011 16:27:52 +0800 Subject: win32: fix memory leak string is allocated by g_malloc, will not be used after putenv, should be free before return. Paolo Bonzini confirmed this is safe under Wine: "1) the underlying Win32 APIs require separate arguments for the variable and value; 2) even though in the end Wine stores the environment as name=value (http://source.winehq.org/source/dlls/ntdll/env.c), it does so in a single consecutive block of memory, not as a char* array like POSIX does. While (2) might apply only to Wine, (1) surely applies to Windows as well." Tested-by: Stefan Weil Reviewed-by: Paolo Bonzini Signed-off-by: Li Zhi Hui Signed-off-by: Stefan Hajnoczi --- os-win32.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'os-win32.c') diff --git a/os-win32.c b/os-win32.c index 8ad5fa1fc3..8523d8d0c4 100644 --- a/os-win32.c +++ b/os-win32.c @@ -44,6 +44,13 @@ int setenv(const char *name, const char *value, int overwrite) char *string = g_malloc(length); snprintf(string, length, "%s=%s", name, value); result = putenv(string); + + /* Windows takes a copy and does not continue to use our string. + * Therefore it can be safely freed on this platform. POSIX code + * typically has to leak the string because according to the spec it + * becomes part of the environment. + */ + g_free(string); } return result; } -- cgit v1.2.1