* environ.cc (spenv::retrieve): Detect return of env_dontadd from cygheap_user

methods.
(build_env): Avoid incrementing environment pointer if not actually adding to
the environment.  That could result in garbage in the environment table.  Be
more defensive when reallocing envblock.
This commit is contained in:
Christopher Faylor 2002-06-29 17:26:13 +00:00
parent 38bc119696
commit 638180f51f
2 changed files with 13 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2002-06-29 Christopher Faylor <cgf@redhat.com>
* environ.cc (spenv::retrieve): Detect return of env_dontadd from
cygheap_user methods.
(build_env): Avoid incrementing environment pointer if not actually
adding to the environment. That could result in garbage in the
environment table. Be more defensive when reallocing envblock.
2002-06-29 Christopher Faylor <cgf@redhat.com>
* uinfo.cc (cygheap_user::test_uid): Return NULL or further tests are

View File

@ -826,7 +826,7 @@ spenv::retrieve (bool no_envblock, const char *const envname)
/* Calculate (potentially) value for given environment variable. */
p = (cygheap->user.*from_cygheap) (name, namelen);
if (!p || (no_envblock && !envname))
if (!p || (no_envblock && !envname) || (p == env_dontadd))
return env_dontadd;
char *s = (char *) cmalloc (HEAP_1_STR, namelen + strlen (p) + 1);
strcpy (s, name);
@ -898,9 +898,8 @@ build_env (const char * const *envp, char *&envblock, int &envc,
if (!saw_spenv[i])
{
*dstp = spenvs[i].retrieve (no_envblock);
if (*dstp && *dstp != env_dontadd)
if (*dstp && *dstp != env_dontadd && !no_envblock)
{
if (!no_envblock)
tl += strlen (*dstp) + 1;
dstp++;
}
@ -941,8 +940,9 @@ build_env (const char * const *envp, char *&envblock, int &envc,
/* See if we need to increase the size of the block. */
if (new_tl > tl)
{
tl = new_tl + 100;
char *new_envblock =
(char *) realloc (envblock, 2 + (tl += len + 100));
(char *) realloc (envblock, 2 + tl);
/* If realloc moves the block, move `s' with it. */
if (new_envblock != envblock)
{