fix crashes in crash handler being handled by DoCleanShutdown
This commit is contained in:
@@ -33,30 +33,32 @@ static bool IsFatalSignal( int signal )
|
||||
}
|
||||
}
|
||||
|
||||
static void DoCleanShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
static bool DoCleanShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
{
|
||||
if( IsFatalSignal(signal) )
|
||||
return;
|
||||
return false;
|
||||
|
||||
/* ^C. */
|
||||
ArchHooks::SetUserQuit();
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(CRASH_HANDLER)
|
||||
static void DoCrashSignalHandler( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
static bool DoCrashSignalHandler( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
{
|
||||
/* Don't dump a debug file if the user just hit ^C. */
|
||||
if( !IsFatalSignal(signal) )
|
||||
return;
|
||||
return true;
|
||||
|
||||
CrashHandler::CrashSignalHandler( signal, si, uc );
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
static bool EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
{
|
||||
if( !IsFatalSignal(signal) )
|
||||
return;
|
||||
return false;
|
||||
|
||||
DoEmergencyShutdown();
|
||||
|
||||
@@ -68,6 +70,7 @@ static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
||||
SignalHandler::ResetSignalHandlers();
|
||||
raise( signal );
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
#if defined(HAVE_TLS)
|
||||
|
||||
@@ -71,8 +71,23 @@ SaveSignals::~SaveSignals()
|
||||
|
||||
static void SigHandler( int signal, siginfo_t *si, void *ucp )
|
||||
{
|
||||
bool bMaskSignal = false;
|
||||
for( unsigned i = 0; i < handlers.size(); ++i )
|
||||
handlers[i]( signal, si, (const ucontext_t *)ucp );
|
||||
bMaskSignal |= handlers[i]( signal, si, (const ucontext_t *)ucp );
|
||||
if( !bMaskSignal )
|
||||
{
|
||||
struct sigaction sa;
|
||||
sa.sa_flags = 0;
|
||||
sigemptyset( &sa.sa_mask );
|
||||
|
||||
/* Set up the default signal handler. */
|
||||
sa.sa_handler = SIG_DFL;
|
||||
|
||||
struct sigaction old;
|
||||
sigaction( signal, &sa, &old );
|
||||
raise( signal );
|
||||
sigaction( signal, &old, NULL );
|
||||
}
|
||||
}
|
||||
|
||||
int find_stack_direction2( char *p )
|
||||
|
||||
@@ -15,7 +15,7 @@ public:
|
||||
|
||||
namespace SignalHandler
|
||||
{
|
||||
typedef void (*handler)( int, siginfo_t *si, const ucontext_t *uc );
|
||||
typedef bool (*handler)( int, siginfo_t *si, const ucontext_t *uc );
|
||||
|
||||
void OnClose( handler );
|
||||
void ResetSignalHandlers();
|
||||
|
||||
Reference in New Issue
Block a user