Commit 45e584dd authored by Sam Lantinga's avatar Sam Lantinga

Do not break application's signal handler installed with SA_SIGINFO

Gleb Natapov to sdl

If application installs SIGINT/SIGTERM signal handler with
sigaction(SA_SIGINFO) syscall before initializing SDL, after
initialization
of SDL signal handler will be reinstalled without SA_SIGINFO flag which
brings havoc when the signal handler is called. The breakage is done by
SDL_QuitInit()/SDL_QuitQuit() function. They use signal() to detect that
signal handler is already installed even in sigaction() is available.
parent 5f721ad5
...@@ -47,7 +47,19 @@ SDL_HandleSIG(int sig) ...@@ -47,7 +47,19 @@ SDL_HandleSIG(int sig)
int int
SDL_QuitInit(void) SDL_QuitInit(void)
{ {
#ifdef HAVE_SIGNAL_H #ifdef HAVE_SIGACTION
struct sigaction action;
sigaction(SIGINT, NULL, &action);
if ( action.sa_handler == SIG_DFL && action.sa_sigaction == SIG_DFL ) {
action.sa_handler = SDL_HandleSIG;
sigaction(SIGINT, &action, NULL);
}
sigaction(SIGTERM, NULL, &action);
if ( action.sa_handler == SIG_DFL && action.sa_sigaction == SIG_DFL ) {
action.sa_handler = SDL_HandleSIG;
sigaction(SIGTERM, &action, NULL);
}
#elif HAVE_SIGNAL_H
void (*ohandler) (int); void (*ohandler) (int);
/* Both SIGINT and SIGTERM are translated into quit interrupts */ /* Both SIGINT and SIGTERM are translated into quit interrupts */
...@@ -66,7 +78,19 @@ SDL_QuitInit(void) ...@@ -66,7 +78,19 @@ SDL_QuitInit(void)
void void
SDL_QuitQuit(void) SDL_QuitQuit(void)
{ {
#ifdef HAVE_SIGNAL_H #ifdef HAVE_SIGACTION
struct sigaction action;
sigaction(SIGINT, NULL, &action);
if ( action.sa_handler == SDL_HandleSIG ) {
action.sa_handler = SIG_DFL;
sigaction(SIGINT, &action, NULL);
}
sigaction(SIGTERM, NULL, &action);
if ( action.sa_handler == SDL_HandleSIG ) {
action.sa_handler = SIG_DFL;
sigaction(SIGTERM, &action, NULL);
}
#elif HAVE_SIGNAL_H
void (*ohandler) (int); void (*ohandler) (int);
ohandler = signal(SIGINT, SIG_DFL); ohandler = signal(SIGINT, SIG_DFL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment