When a crash signal is delivered do two things: remove all of our

signal handlers to prevent reentrance on unrelated things (a sigabort
where the handle bus errors) also, clear the signal mask so that the
signal doesn't infinitely reissue.  This fixes rdar://6654827 -
Crash causes clang to loop



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66330 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-03-07 08:15:47 +00:00
parent b9c6c9bfe4
commit 922a881f32

View File

@ -55,13 +55,23 @@ static const int KillSigs[] = {
static const int *const KillSigsEnd =
KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]);
// SignalHandler - The signal handler that runs...
static void UnregisterHandler(int Signal) {
signal(Signal, SIG_DFL);
}
// SignalHandler - The signal handler that runs.
static RETSIGTYPE SignalHandler(int Sig) {
// Restore the signal behavior to default, so that the program actually
// crashes when we return and the signal reissues. This also ensures that if
// we crash in our signal handler that the program will terminate immediately
// instead of recursing in the signal handler.
signal(Sig, SIG_DFL);
std::for_each(KillSigs, KillSigsEnd, UnregisterHandler);
// Unmask all potentially blocked kill signals.
sigset_t SigMask;
sigfillset(&SigMask);
sigprocmask(SIG_UNBLOCK, &SigMask, 0);
if (FilesToRemove != 0)
while (!FilesToRemove->empty()) {
@ -86,12 +96,11 @@ static RETSIGTYPE SignalHandler(int Sig) {
}
// Just call signal
static void RegisterHandler(int Signal) {
signal(Signal, SignalHandler);
static void RegisterHandler(int Signal) {
signal(Signal, SignalHandler);
}
void sys::SetInterruptFunction(void (*IF)()) {
InterruptFunction = IF;
RegisterHandler(SIGINT);