Call FreeEnvironmentStrings when msvcrt is unloaded.
diff --git a/dlls/msvcrt/data.c b/dlls/msvcrt/data.c
index 0f03057..e4cb6f9 100644
--- a/dlls/msvcrt/data.c
+++ b/dlls/msvcrt/data.c
@@ -42,6 +42,9 @@
int MSVCRT_timezone;
int MSVCRT_app_type;
+static char* environ_strings;
+static WCHAR* wenviron_strings;
+
typedef void (*_INITTERMFUN)(void);
/***********************************************************************
@@ -136,14 +139,14 @@
}
/* INTERNAL: Since we can't rely on Winelib startup code calling w/getmainargs,
- * we initialise data values during DLL loading. The when called by a native
+ * we initialise data values during DLL loading. When called by a native
* program we simply return the data we've already initialised. This also means
* you can call multiple times without leaking
*/
void msvcrt_init_args(void)
{
- char *cmdline, **xargv = NULL, *ptr, *env;
- WCHAR *wcmdline, **wxargv = NULL, *wptr, *wenv;
+ char *cmdline, **xargv = NULL, *ptr;
+ WCHAR *wcmdline, **wxargv = NULL, *wptr;
int xargc,end,last_arg,afterlastspace,count;
DWORD version;
@@ -222,9 +225,9 @@
TRACE("found %d arguments\n",MSVCRT___argc);
- env = GetEnvironmentStringsA();
+ environ_strings = GetEnvironmentStringsA();
count = 1; /* for NULL sentinel */
- for (ptr = env; *ptr; ptr += strlen(ptr) + 1)
+ for (ptr = environ_strings; *ptr; ptr += strlen(ptr) + 1)
{
count++;
}
@@ -232,7 +235,7 @@
if (MSVCRT__environ)
{
count = 0;
- for (ptr = env; *ptr; ptr += strlen(ptr) + 1)
+ for (ptr = environ_strings; *ptr; ptr += strlen(ptr) + 1)
{
MSVCRT__environ[count++] = ptr;
}
@@ -241,9 +244,9 @@
MSVCRT___initenv = MSVCRT__environ;
- wenv = GetEnvironmentStringsW();
+ wenviron_strings = GetEnvironmentStringsW();
count = 1; /* for NULL sentinel */
- for (wptr = wenv; *wptr; wptr += lstrlenW(wptr) + 1)
+ for (wptr = wenviron_strings; *wptr; wptr += lstrlenW(wptr) + 1)
{
count++;
}
@@ -251,7 +254,7 @@
if (MSVCRT__wenviron)
{
count = 0;
- for (wptr = wenv; *wptr; wptr += lstrlenW(wptr) + 1)
+ for (wptr = wenviron_strings; *wptr; wptr += lstrlenW(wptr) + 1)
{
MSVCRT__wenviron[count++] = wptr;
}
@@ -264,7 +267,9 @@
/* INTERNAL: free memory used by args */
void msvcrt_free_args(void)
{
- /* FIXME */
+ /* FIXME: more things to free */
+ FreeEnvironmentStringsA(environ_strings);
+ FreeEnvironmentStringsW(wenviron_strings);
}
/*********************************************************************