diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2015-04-19 01:06:33 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2015-04-19 01:07:31 -0700 |
commit | 03c1e456b079929a8290aeb4aadb05c0df73bfd2 (patch) | |
tree | 623a6bf41a61e08caffed4a2914bac4947c162ab /stdlib | |
parent | Avoid confusing compiler with dynamically impossible statically invalid deref... (diff) | |
download | glibc-03c1e456b079929a8290aeb4aadb05c0df73bfd2.tar.gz glibc-03c1e456b079929a8290aeb4aadb05c0df73bfd2.tar.bz2 glibc-03c1e456b079929a8290aeb4aadb05c0df73bfd2.zip |
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.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/setenv.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/stdlib/setenv.c b/stdlib/setenv.c index b60c4f0151..184a8cdd07 100644 --- a/stdlib/setenv.c +++ b/stdlib/setenv.c @@ -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; |