diff options
author | Zhi Hui Li <zhihuili@linux.vnet.ibm.com> | 2011-11-24 16:27:52 +0800 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> | 2011-12-06 09:56:41 +0000 |
commit | 91a9ecefb6d7f066c6eecc09f7231ce7969d1817 (patch) | |
tree | b9b6aa6d2ec6f6cb539fa2caebc7da0bf07a4b00 | |
parent | c7ee8f683d93c7ea346a5eb86495da672ce7e7da (diff) |
win32: fix memory leak
string is allocated by g_malloc, will not be used after putenv, should be
free before return.
Paolo Bonzini <pbonzini@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 <sw@weilnetz.de>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Li Zhi Hui <zhihuili@linux.vnet.ibm.com>
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
-rw-r--r-- | os-win32.c | 7 |
1 files changed, 7 insertions, 0 deletions
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; } |