added code to free memory allocated in wxSetEnv() when it uses putenv()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47574 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -20,12 +20,18 @@
|
|||||||
|
|
||||||
#include "wx/utils.h"
|
#include "wx/utils.h"
|
||||||
|
|
||||||
|
#define USE_PUTENV (!defined(HAVE_SETENV) && defined(HAVE_PUTENV))
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
#include "wx/string.h"
|
#include "wx/string.h"
|
||||||
#include "wx/intl.h"
|
#include "wx/intl.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
#include "wx/app.h"
|
#include "wx/app.h"
|
||||||
#include "wx/wxcrtvararg.h"
|
#include "wx/wxcrtvararg.h"
|
||||||
|
#if USE_PUTENV
|
||||||
|
#include "wx/module.h"
|
||||||
|
#include "wx/hashmap.h"
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/apptrait.h"
|
#include "wx/apptrait.h"
|
||||||
@@ -1045,6 +1051,35 @@ bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspace
|
|||||||
// env vars
|
// env vars
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#if USE_PUTENV
|
||||||
|
|
||||||
|
WX_DECLARE_STRING_HASH_MAP(char *, wxEnvVars);
|
||||||
|
|
||||||
|
static wxEnvVars gs_envVars;
|
||||||
|
|
||||||
|
class wxSetEnvModule : public wxModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool OnInit() { return true; }
|
||||||
|
virtual void OnExit()
|
||||||
|
{
|
||||||
|
for ( wxEnvVars::const_iterator i = gs_envVars.begin();
|
||||||
|
i != gs_envVars.end();
|
||||||
|
++i )
|
||||||
|
{
|
||||||
|
free(i->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
gs_envVars.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxSetEnvModule)
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_DYNAMIC_CLASS(wxSetEnvModule, wxModule)
|
||||||
|
|
||||||
|
#endif // USE_PUTENV
|
||||||
|
|
||||||
bool wxGetEnv(const wxString& var, wxString *value)
|
bool wxGetEnv(const wxString& var, wxString *value)
|
||||||
{
|
{
|
||||||
// wxGetenv is defined as getenv()
|
// wxGetenv is defined as getenv()
|
||||||
@@ -1072,10 +1107,21 @@ static bool wxDoSetEnv(const wxString& variable, const char *value)
|
|||||||
// transform to ANSI
|
// transform to ANSI
|
||||||
const wxWX2MBbuf p = s.mb_str();
|
const wxWX2MBbuf p = s.mb_str();
|
||||||
|
|
||||||
// the string will be free()d by libc
|
|
||||||
char *buf = (char *)malloc(strlen(p) + 1);
|
char *buf = (char *)malloc(strlen(p) + 1);
|
||||||
strcpy(buf, p);
|
strcpy(buf, p);
|
||||||
|
|
||||||
|
// store the string to free() it later
|
||||||
|
wxEnvVars::iterator i = gs_envVars.find(variable);
|
||||||
|
if ( i != gs_envVars.end() )
|
||||||
|
{
|
||||||
|
free(i->second);
|
||||||
|
i->second = buf;
|
||||||
|
}
|
||||||
|
else // this variable hadn't been set before
|
||||||
|
{
|
||||||
|
gs_envVars[variable] = buf;
|
||||||
|
}
|
||||||
|
|
||||||
return putenv(buf) == 0;
|
return putenv(buf) == 0;
|
||||||
#else // no way to set an env var
|
#else // no way to set an env var
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user