about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOndřej Bílka <neleai@seznam.cz>2014-02-10 12:50:46 +0100
committerOndřej Bílka <neleai@seznam.cz>2014-02-10 12:54:10 +0100
commitf3d338c9f3e84dac5458d388efd785c4ef0df7ec (patch)
tree6d8bf33159aae83b06d901c9167db4f82ab352bd
parentbdfe308a166b433a841d5c9ae256560c18bce640 (diff)
downloadglibc-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--ChangeLog5
-rw-r--r--NEWS2
-rw-r--r--stdlib/setenv.c75
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;