Deduplicate setenv.

Setenv contained a code path that was redundant as it could be handled
in general case.
This commit is contained in:
Ondřej Bílka 2014-02-10 12:50:46 +01:00
parent bdfe308a16
commit f3d338c9f3
3 changed files with 10 additions and 72 deletions

View File

@ -1,3 +1,8 @@
2014-02-10 Ondřej Bílka <neleai@seznam.cz>
[BZ #15894]
* stdlib/setenv.c (__add_to_environ): Remove duplicate code.
2014-02-10 Ondřej Bílka <neleai@seznam.cz> 2014-02-10 Ondřej Bílka <neleai@seznam.cz>
* malloc/arena.c (grow_heap, get_free_list, reused_arena, * malloc/arena.c (grow_heap, get_free_list, reused_arena,

2
NEWS
View File

@ -9,6 +9,8 @@ Version 2.20
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
15894.
* The am33 port, which had not worked for several years, has been removed * The am33 port, which had not worked for several years, has been removed
from ports. from ports.

View File

@ -146,82 +146,13 @@ __add_to_environ (name, value, combined, replace)
UNLOCK; UNLOCK;
return -1; return -1;
} }
new_environ[size] = NULL;
/* If the whole entry is given add it. */
if (combined != NULL)
/* We must not add the string to the search tree since it belongs
to the user. */
new_environ[size] = (char *) combined;
else
{
/* See whether the value is already known. */
#ifdef USE_TSEARCH
char *new_value;
int use_alloca = __libc_use_alloca (varlen);
if (__builtin_expect (use_alloca, 1))
new_value = (char *) alloca (varlen);
else
{
new_value = malloc (varlen);
if (new_value == NULL)
{
UNLOCK;
if (last_environ == NULL)
free (new_environ);
return -1;
}
}
# ifdef _LIBC
__mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
value, vallen);
# else
memcpy (new_value, name, namelen);
new_value[namelen] = '=';
memcpy (&new_value[namelen + 1], value, vallen);
# endif
new_environ[size] = KNOWN_VALUE (new_value);
if (__builtin_expect (new_environ[size] == NULL, 1))
#endif
{
#ifdef USE_TSEARCH
if (__builtin_expect (! use_alloca, 0))
new_environ[size] = new_value;
else
#endif
{
new_environ[size] = (char *) malloc (varlen);
if (__builtin_expect (new_environ[size] == NULL, 0))
{
UNLOCK;
return -1;
}
#ifdef USE_TSEARCH
memcpy (new_environ[size], new_value, varlen);
#else
memcpy (new_environ[size], name, namelen);
new_environ[size][namelen] = '=';
memcpy (&new_environ[size][namelen + 1], value, vallen);
#endif
}
/* And save the value now. We cannot do this when we remove
the string since then we cannot decide whether it is a
user string or not. */
STORE_VALUE (new_environ[size]);
}
}
if (__environ != last_environ)
memcpy ((char *) new_environ, (char *) __environ,
size * sizeof (char *));
new_environ[size + 1] = NULL; new_environ[size + 1] = NULL;
ep = new_environ + size;
last_environ = __environ = new_environ; last_environ = __environ = new_environ;
} }
else if (replace) if (*ep == NULL || replace)
{ {
char *np; char *np;