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-all mailing list