Better fix for setenv (..., NULL, ...)

* stdlib/setenv.c (__add_to_environ):
Dump core quickly if setenv (..., NULL, ...) is called.
This time, do it the right way, and pacify GCC with a pragma.
This commit is contained in:
Paul Eggert 2015-04-19 01:06:33 -07:00
parent 2bd2cad9e8
commit 03c1e456b0
2 changed files with 23 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2015-04-19 Paul Eggert <eggert@cs.ucla.edu>
* stdlib/setenv.c (__add_to_environ):
Dump core quickly if setenv (..., NULL, ...) is called.
This time, do it the right way, and pacify GCC with a pragma.
2015-04-17 Roland McGrath <roland@hack.frob.com>
* elf/dl-close.c (_dl_close_worker) [DL_NNS == 1]: Just assert that

View File

@ -19,6 +19,13 @@
# include <config.h>
#endif
/* Pacify GCC; see the commentary about VALLEN below. This is needed
at least through GCC 4.9.2. Pacify GCC for the entire file, as
there seems to be no way to pacify GCC selectively, only for the
place where it's needed. Do not use DIAG_IGNORE_NEEDS_COMMENT
here, as it's not defined yet. */
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#include <errno.h>
#if !_LIBC
# if !defined errno && !defined HAVE_ERRNO_DECL
@ -114,8 +121,17 @@ __add_to_environ (name, value, combined, replace)
{
char **ep;
size_t size;
/* Compute lengths before locking, so that the critical section is
less of a performance bottleneck. VALLEN is needed only if
COMBINED is null (unfortunately GCC is not smart enough to deduce
this; see the #pragma at the start of this file). Testing
COMBINED instead of VALUE causes setenv (..., NULL, ...) to dump
core now instead of corrupting memory later. */
const size_t namelen = strlen (name);
const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
size_t vallen;
if (combined == NULL)
vallen = strlen (value) + 1;
LOCK;