diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2012-10-01 15:12:44 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-10-01 15:12:44 -0700 |
commit | aa1ba90e4a95542c83cf636de3bc67e8fb23bad3 (patch) | |
tree | 1407a999bbc11bf54aaeba40764d6a75565db182 /src/syssignal.h | |
parent | ace917bddb2ed2448a97ddf279445bb581c5cd32 (diff) | |
download | emacs-aa1ba90e4a95542c83cf636de3bc67e8fb23bad3.tar.gz |
Fix a malloc race condition involving strsignal.
A signal can arrive in the middle of a malloc, and Emacs's signal
handler can invoke strsignal, which can invoke malloc, which is
not portable. This race condition bug makes Emacs hang on GNU/Linux.
Fix it by altering the signal handler so that it does not invoke
strsignal.
* emacs.c (shut_down_emacs): Use safe_strsignal, not strsignal.
* process.c (status_message): Use const pointer, in case strsignal
is #defined to safe_strsignal.
* sysdep.c (sys_siglist, init_signals): Always define and
initialize a substitute sys_siglist if the system does not define
one, even if HAVE_STRSIGNAL.
(safe_strsignal): Rename from strsignal. Always define,
using sys_siglist. Return a const pointer.
* syssignal.h (safe_strsignal): New decl.
(strsignal) [!HAVE_STRSIGNAL]: Define in terms of safe_strsignal.
Diffstat (limited to 'src/syssignal.h')
-rw-r--r-- | src/syssignal.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/syssignal.h b/src/syssignal.h index ece2515dec9..66538aad100 100644 --- a/src/syssignal.h +++ b/src/syssignal.h @@ -39,6 +39,7 @@ extern sigset_t empty_mask; typedef void (*signal_handler_t) (int); extern void emacs_sigaction_init (struct sigaction *, signal_handler_t); +char const *safe_strsignal (int); #if NSIG < NSIG_MINIMUM # undef NSIG @@ -70,8 +71,7 @@ extern void emacs_sigaction_init (struct sigaction *, signal_handler_t); #endif /* ! defined (SIGCLD) */ #ifndef HAVE_STRSIGNAL -/* strsignal is in sysdep.c */ -char *strsignal (int); +# define strsignal(sig) safe_strsignal (sig) #endif void deliver_process_signal (int, signal_handler_t); |