svn commit: r199983 - in head: lib/libc/stdlib
tools/regression/environ
Sean C. Farley
scf at FreeBSD.org
Tue Dec 1 16:02:01 UTC 2009
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
--
scf at FreeBSD.org
More information about the svn-src-head
mailing list