mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
Deduplicate setenv.
Setenv contained a code path that was redundant as it could be handled in general case.
This commit is contained in:
parent
bdfe308a16
commit
f3d338c9f3
@ -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>
|
||||
|
||||
* malloc/arena.c (grow_heap, get_free_list, reused_arena,
|
||||
|
2
NEWS
2
NEWS
@ -9,6 +9,8 @@ Version 2.20
|
||||
|
||||
* The following bugs are resolved with this release:
|
||||
|
||||
15894.
|
||||
|
||||
* The am33 port, which had not worked for several years, has been removed
|
||||
from ports.
|
||||
|
||||
|
@ -146,82 +146,13 @@ __add_to_environ (name, value, combined, replace)
|
||||
UNLOCK;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 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] = NULL;
|
||||
new_environ[size + 1] = NULL;
|
||||
ep = new_environ + size;
|
||||
|
||||
last_environ = __environ = new_environ;
|
||||
}
|
||||
else if (replace)
|
||||
if (*ep == NULL || replace)
|
||||
{
|
||||
char *np;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user