Temporarily revert the previous change because the linker has been

modified so that it will abort when the environment is bad.
This commit is contained in:
Brian Feldman 2009-12-01 06:42:47 +00:00
parent 84518325ab
commit 56a3273e0b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=199987

View file

@ -96,8 +96,6 @@ static int envVarsTotal = 0;
/* Deinitialization of new environment. */
static void __attribute__ ((destructor)) __clean_env_destructor(void);
/* Resetting the environ pointer will affect the env functions. */
static int __merge_environ(void);
/*
@ -192,9 +190,6 @@ __findenv_environ(const char *name, size_t nameLen)
{
int envNdx;
if (environ == NULL)
return (NULL);
/* Find variable within environ. */
for (envNdx = 0; environ[envNdx] != NULL; envNdx++)
if (strncmpeq(environ[envNdx], name, nameLen))
@ -333,7 +328,6 @@ __build_env(void)
{
char **env;
int activeNdx;
int checking;
int envNdx;
int savedErrno;
size_t nameLen;
@ -345,23 +339,6 @@ __build_env(void)
/* Count environment variables. */
for (env = environ, envVarsTotal = 0; *env != NULL; env++)
envVarsTotal++;
/* Remove any corrupt variable entries, but do not error out. */
checking = 0;
while (checking < envVarsTotal) {
if (strchr(environ[checking], '=') != NULL) {
checking++;
} else {
__env_warnx(CorruptEnvValueMsg,
environ[checking], strlen(environ[checking]));
/*
* Pull back all remaining entries from checking + 1
* through envVarsTotal, including the NULL at the end.
*/
memmove(&environ[checking], &environ[checking + 1],
sizeof(char *) * (envVarsTotal - checking));
envVarsTotal--;
}
}
envVarsSize = envVarsTotal * 2;
/* Create new environment. */
@ -376,8 +353,18 @@ __build_env(void)
strdup(environ[envVarsTotal - envNdx - 1]);
if (envVars[envNdx].name == NULL)
goto Failure;
envVars[envNdx].value = strchr(envVars[envNdx].name, '=') + 1;
envVars[envNdx].valueSize = strlen(envVars[envNdx].value);
envVars[envNdx].value = strchr(envVars[envNdx].name, '=');
if (envVars[envNdx].value != NULL) {
envVars[envNdx].value++;
envVars[envNdx].valueSize =
strlen(envVars[envNdx].value);
} else {
__env_warnx(CorruptEnvValueMsg, envVars[envNdx].name,
strlen(envVars[envNdx].name));
errno = EFAULT;
goto Failure;
}
/*
* Find most current version of variable to make active. This
* will prevent multiple active variables from being created
@ -439,18 +426,22 @@ getenv(const char *name)
}
/*
* If we have not already allocated memory by performing
* write operations on the environment, avoid doing so now.
* 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 (envVars == NULL)
return (__findenv_environ(name, nameLen));
/* Synchronize environment. */
if (__merge_environ() == -1)
if (environ == NULL || environ[0] == NULL)
return (NULL);
envNdx = envVarsTotal - 1;
return (__findenv(name, nameLen, &envNdx, true));
else if (envVars == NULL || environ != intEnviron)
return (__findenv_environ(name, nameLen));
else {
envNdx = envVarsTotal - 1;
return (__findenv(name, nameLen, &envNdx, true));
}
}
@ -568,7 +559,8 @@ __merge_environ(void)
if ((equals = strchr(*env, '=')) == NULL) {
__env_warnx(CorruptEnvValueMsg, *env,
strlen(*env));
continue;
errno = EFAULT;
return (-1);
}
if (__setenv(*env, equals - *env, equals + 1,
1) == -1)