diff options
author | Ondřej Bílka <neleai@seznam.cz> | 2014-02-10 12:50:46 +0100 |
---|---|---|
committer | Ondřej Bílka <neleai@seznam.cz> | 2014-02-10 12:54:10 +0100 |
commit | f3d338c9f3e84dac5458d388efd785c4ef0df7ec (patch) | |
tree | 6d8bf33159aae83b06d901c9167db4f82ab352bd | |
parent | bdfe308a166b433a841d5c9ae256560c18bce640 (diff) | |
download | glibc-f3d338c9f3e84dac5458d388efd785c4ef0df7ec.tar.gz glibc-f3d338c9f3e84dac5458d388efd785c4ef0df7ec.tar.xz glibc-f3d338c9f3e84dac5458d388efd785c4ef0df7ec.zip |
Deduplicate setenv.
Setenv contained a code path that was redundant as it could be handled in general case.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | stdlib/setenv.c | 75 |
3 files changed, 10 insertions, 72 deletions
diff --git a/ChangeLog b/ChangeLog index bded2c3a39..cf1b17d161 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 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, arena_get2): Remove THREAD_STATS conditionals. * malloc/malloc.c (__malloc_assert, __libc_realloc, _int_free, diff --git a/NEWS b/NEWS index 851167f855..0f4b8d4f38 100644 --- a/NEWS +++ b/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. diff --git a/stdlib/setenv.c b/stdlib/setenv.c index 7df5b3fd5f..3043498103 100644 --- a/stdlib/setenv.c +++ b/stdlib/setenv.c @@ -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; |