OSDN Git Service

* environ.cc (spenv::retrieve): Detect return of env_dontadd from cygheap_user
authorcgf <cgf>
Sat, 29 Jun 2002 17:26:12 +0000 (17:26 +0000)
committercgf <cgf>
Sat, 29 Jun 2002 17:26:12 +0000 (17:26 +0000)
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.

winsup/cygwin/ChangeLog
winsup/cygwin/environ.cc

index 627db82..f314e86 100644 (file)
@@ -1,5 +1,13 @@
 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
        sorta useless.
        (cygheap_user::env_domain): Recalculate if name is missing.
index b86b6b8..d0c60ed 100644 (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,10 +898,9 @@ 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;
+           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)
                {