This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Deduplicate setenv.c
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Fri, 18 Oct 2013 16:47:12 +0200
- Subject: Re: [PATCH] Deduplicate setenv.c
- Authentication-results: sourceware.org; auth=none
- References: <20131015093450 dot GA1459 at domone dot podge>
ping,
I realized that this code movement fixes leak in bug 15894.
On Tue, Oct 15, 2013 at 11:34:50AM +0200, OndÅej BÃlka wrote:
> Hi,
>
> In setenv.c file a logic of adding element is needlessly duplicated
> based on if we extend __environ or not. This can be easily fixed in
> following way:
>
> * stdlib/setenv.c: Remove duplicate code.
>
> diff --git a/stdlib/setenv.c b/stdlib/setenv.c
> index 63c995b..e4b5b5e 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;
>
--
NOTICE: alloc: /dev/null: filesystem full