From: Zhi Hui Li <zhihu...@linux.vnet.ibm.com> string is allocated by g_malloc, will not be used after putenv, should be free before return.
Paolo Bonzini <pbonz...@redhat.com> 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 <s...@weilnetz.de> Reviewed-by: Paolo Bonzini <pbonz...@redhat.com> Signed-off-by: Li Zhi Hui <zhihu...@linux.vnet.ibm.com> Signed-off-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> --- os-win32.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/os-win32.c b/os-win32.c index 8ad5fa1..8523d8d 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; } -- 1.7.7.3