Rewrote getenv and _wgetenv to avoid returning a pointer to a freed
memory block.
This commit is contained in:
parent
7add08a303
commit
b48d812433
|
@ -35,27 +35,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
|
||||||
*/
|
*/
|
||||||
char *MSVCRT_getenv(const char *name)
|
char *MSVCRT_getenv(const char *name)
|
||||||
{
|
{
|
||||||
char *environ = GetEnvironmentStringsA();
|
char **environ;
|
||||||
char *pp,*pos = NULL;
|
unsigned int length=strlen(name);
|
||||||
unsigned int length=strlen(name);
|
|
||||||
|
|
||||||
for (pp = environ; (*pp); pp = pp + strlen(pp) +1)
|
for (environ = *__p__environ(); *environ; environ++)
|
||||||
{
|
{
|
||||||
pos =strchr(pp,'=');
|
char *str = *environ;
|
||||||
if ((pos) && ((pos - pp) == length))
|
char *pos = strchr(str,'=');
|
||||||
{
|
if (pos && ((pos - str) == length) && !strncasecmp(str,name,length))
|
||||||
if (!strncasecmp(pp,name,length)) break;
|
{
|
||||||
}
|
TRACE("(%s): got %s\n", debugstr_a(name), debugstr_a(pos + 1));
|
||||||
}
|
return pos + 1;
|
||||||
if ((*pp)&& (pos))
|
}
|
||||||
{
|
}
|
||||||
pp = pos+1;
|
return NULL;
|
||||||
TRACE("got %s\n",pp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pp = 0;
|
|
||||||
FreeEnvironmentStringsA( environ );
|
|
||||||
return pp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
@ -63,28 +56,20 @@ char *MSVCRT_getenv(const char *name)
|
||||||
*/
|
*/
|
||||||
MSVCRT_wchar_t *_wgetenv(const MSVCRT_wchar_t *name)
|
MSVCRT_wchar_t *_wgetenv(const MSVCRT_wchar_t *name)
|
||||||
{
|
{
|
||||||
MSVCRT_wchar_t* environ = GetEnvironmentStringsW();
|
MSVCRT_wchar_t **environ;
|
||||||
MSVCRT_wchar_t* pp,*pos = NULL;
|
unsigned int length=strlenW(name);
|
||||||
unsigned int length=strlenW(name);
|
|
||||||
|
|
||||||
for (pp = environ; (*pp); pp = pp + strlenW(pp) + 1)
|
for (environ = *__p__wenviron(); *environ; environ++)
|
||||||
{
|
{
|
||||||
pos = strchrW(pp,'=');
|
MSVCRT_wchar_t *str = *environ;
|
||||||
if ((pos) && ((pos - pp) == length))
|
MSVCRT_wchar_t *pos = strchrW(str,'=');
|
||||||
{
|
if (pos && ((pos - str) == length) && !strncmpiW(str,name,length))
|
||||||
if (!strncmpiW(pp,name,length))
|
{
|
||||||
{
|
TRACE("(%s): got %s\n", debugstr_w(name), debugstr_w(pos + 1));
|
||||||
pp = pos+1;
|
return pos + 1;
|
||||||
TRACE("got %s\n",debugstr_w(pp));
|
}
|
||||||
/* can't free pointer since we are returning it */
|
}
|
||||||
/* should probably use MSVCRT_wenviron instead */
|
return NULL;
|
||||||
FIXME( "memory leak\n" );
|
|
||||||
return pp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FreeEnvironmentStringsW( environ );
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue