msvcrt: environ handling

Francois Gouget fgouget at free.fr
Wed May 30 21:47:52 CDT 2001


   Now that the environment is initialized correctly, we should free
memory too when msvcrt is being unloaded.


Changelog:

 * dlls/msvcrt/data.c

   Call FreeEnvironmentStrings when msvcrt is unloaded

--
Francois Gouget         fgouget at free.fr        http://fgouget.free.fr/
                               {free} || die "";

-------------- next part --------------
Index: dlls/msvcrt/data.c
===================================================================
RCS file: /home/cvs/wine/wine/dlls/msvcrt/data.c,v
retrieving revision 1.9
diff -u -r1.9 data.c
--- dlls/msvcrt/data.c	2001/05/22 19:17:26	1.9
+++ dlls/msvcrt/data.c	2001/05/30 19:46:10
@@ -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 +226,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 +236,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 +245,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 +255,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 +268,9 @@
 /* INTERNAL: free memory used by args */
 void msvcrt_free_args(void)
 {
-  /* FIXME */
+  /* FIXME: more things to free */
+  FreeEnvironmentStringsA(environ_strings);
+  FreeEnvironmentStringsW(wenviron_strings);
 }
 
 /*********************************************************************


More information about the wine-patches mailing list