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) )
|
if( IsFatalSignal(signal) )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
/* ^C. */
|
/* ^C. */
|
||||||
ArchHooks::SetUserQuit();
|
ArchHooks::SetUserQuit();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CRASH_HANDLER)
|
#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. */
|
/* Don't dump a debug file if the user just hit ^C. */
|
||||||
if( !IsFatalSignal(signal) )
|
if( !IsFatalSignal(signal) )
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
CrashHandler::CrashSignalHandler( signal, si, uc );
|
CrashHandler::CrashSignalHandler( signal, si, uc );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#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) )
|
if( !IsFatalSignal(signal) )
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
DoEmergencyShutdown();
|
DoEmergencyShutdown();
|
||||||
|
|
||||||
@@ -68,6 +70,7 @@ static void EmergencyShutdown( int signal, siginfo_t *si, const ucontext_t *uc )
|
|||||||
SignalHandler::ResetSignalHandlers();
|
SignalHandler::ResetSignalHandlers();
|
||||||
raise( signal );
|
raise( signal );
|
||||||
#endif
|
#endif
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_TLS)
|
#if defined(HAVE_TLS)
|
||||||
|
|||||||
@@ -71,8 +71,23 @@ SaveSignals::~SaveSignals()
|
|||||||
|
|
||||||
static void SigHandler( int signal, siginfo_t *si, void *ucp )
|
static void SigHandler( int signal, siginfo_t *si, void *ucp )
|
||||||
{
|
{
|
||||||
|
bool bMaskSignal = false;
|
||||||
for( unsigned i = 0; i < handlers.size(); ++i )
|
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 )
|
int find_stack_direction2( char *p )
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public:
|
|||||||
|
|
||||||
namespace SignalHandler
|
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 OnClose( handler );
|
||||||
void ResetSignalHandlers();
|
void ResetSignalHandlers();
|
||||||
|
|||||||
Reference in New Issue
Block a user