void nsProfileLock::FatalSignalHandler(int signo #ifdef SA_SIGINFO , siginfo_t *info, void *context #endif ) { // Remove any locks still held. RemovePidLockFiles(true); // Chain to the old handler, which may exit. struct sigaction *oldact = nullptr; switch (signo) { case SIGHUP: oldact = &SIGHUP_oldact; break; case SIGINT: oldact = &SIGINT_oldact; break; case SIGQUIT: oldact = &SIGQUIT_oldact; break; case SIGILL: oldact = &SIGILL_oldact; break; case SIGABRT: oldact = &SIGABRT_oldact; break; case SIGSEGV: oldact = &SIGSEGV_oldact; break; case SIGTERM: oldact = &SIGTERM_oldact; break; default: NS_NOTREACHED("bad signo"); break; } if (oldact) { if (oldact->sa_handler == SIG_DFL) { // Make sure the default sig handler is executed // We need it to get Mozilla to dump core. sigaction(signo,oldact, nullptr); // Now that we've restored the default handler, unmask the // signal and invoke it. sigset_t unblock_sigs; sigemptyset(&unblock_sigs); sigaddset(&unblock_sigs, signo); sigprocmask(SIG_UNBLOCK, &unblock_sigs, nullptr); raise(signo); } #ifdef SA_SIGINFO else if (oldact->sa_sigaction && (oldact->sa_flags & SA_SIGINFO) == SA_SIGINFO) { oldact->sa_sigaction(signo, info, context); } #endif else if (oldact->sa_handler && oldact->sa_handler != SIG_IGN) { oldact->sa_handler(signo); } } // Backstop exit call, just in case. _exit(signo); }
void nsProfileLock::FatalSignalHandler(int signo #ifdef SA_SIGINFO , siginfo_t *info, void *context #endif ) { // Remove any locks still held. RemovePidLockFiles(true); // Chain to the old handler, which may exit. struct sigaction *oldact = nullptr; switch (signo) { case SIGHUP: oldact = &SIGHUP_oldact; break; case SIGINT: oldact = &SIGINT_oldact; break; case SIGQUIT: oldact = &SIGQUIT_oldact; break; case SIGILL: oldact = &SIGILL_oldact; break; case SIGABRT: oldact = &SIGABRT_oldact; break; case SIGSEGV: oldact = &SIGSEGV_oldact; break; case SIGTERM: oldact = &SIGTERM_oldact; break; default: NS_NOTREACHED("bad signo"); break; } if (oldact) { if (oldact->sa_handler == SIG_DFL) { // Make sure the default sig handler is executed // We need it to get Mozilla to dump core. sigaction(signo,oldact, nullptr); // Now that we've restored the default handler, unmask the // signal and invoke it. sigset_t unblock_sigs; sigemptyset(&unblock_sigs); sigaddset(&unblock_sigs, signo); sigprocmask(SIG_UNBLOCK, &unblock_sigs, nullptr); raise(signo); } #ifdef SA_SIGINFO else if (oldact->sa_sigaction && (oldact->sa_flags & SA_SIGINFO) == SA_SIGINFO) { oldact->sa_sigaction(signo, info, context); } #endif else if (oldact->sa_handler && oldact->sa_handler != SIG_IGN) { oldact->sa_handler(signo); } } #ifdef MOZ_WIDGET_GONK switch (signo) { case SIGQUIT: case SIGILL: case SIGABRT: case SIGSEGV: #ifndef MOZ_CRASHREPORTER // Retrigger the signal for those that can generate a core dump signal(signo, SIG_DFL); if (info->si_code <= 0) { if (syscall(__NR_tgkill, getpid(), syscall(__NR_gettid), signo) < 0) { break; } } #endif return; default: break; } #endif // Backstop exit call, just in case. _exit(signo); }