On Tue, 1 Dec 2009, Brian Feldman wrote:

 I also fixed another inconsistency in getenv(3) where updating the
 global environ pointer would not be reflected in the return values.
 It would have taken an intermediary setenv(3)/putenv(3)/unsetenv(3)
 in order to see the change.

In the current code, if environ is replaced or none of the set/put/unset calls have been made, getenv() will use __findenv_environ() (searches environ directly) to find the entry. This is necessary since malloc() depends upon getenv() creating a cross-dependency.

@@ -426,22 +439,18 @@ getenv(const char *name)
        }

        /*
-        * An empty environment (environ or its first value) regardless if
-        * environ has been copied before will return a NULL.
-        *
-        * If the environment is not empty, find an environment variable via
-        * environ if environ has not been copied via an *env() call or been
-        * replaced by a running program, otherwise, use the rebuilt
-        * environment.
+        * If we have not already allocated memory by performing
+        * write operations on the environment, avoid doing so now.
         */
-       if (environ == NULL || environ[0] == NULL)
-               return (NULL);
-       else if (envVars == NULL || environ != intEnviron)
+       if (envVars == NULL)
                return (__findenv_environ(name, nameLen));
-       else {
-               envNdx = envVarsTotal - 1;
-               return (__findenv(name, nameLen, &envNdx, true));
-       }
+
+       /* Synchronize environment. */
+       if (__merge_environ() == -1)
+               return (NULL);
+
+       envNdx = envVarsTotal - 1;
+       return (__findenv(name, nameLen, &envNdx, true));
}


Sean
--
s...@freebsd.org
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to