Fix endless loops for handling SIGBUS and SIGSEGV.

r80270 has the usual wrong fix for unsafe signal handling -- just set
a flag and return to let an event loop check the flag and do safe
handling.  This never works for signals like SIGBUS and SIGSEGV that
repeat and works poorly for others unless the application has an event
loop designed to support this.

For these signals, clean up unsafely as before, except for arranging that
nested signals are fatal and forcing a nested signal if the cleanup doesn't
cause one.
This commit is contained in:
Bruce Evans 2019-03-29 15:57:08 +00:00
parent 0410dc5f5d
commit cfcc114dcb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345696

View File

@ -31,9 +31,9 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
@ -107,14 +107,22 @@ struct vt_mode smode;
}
static void
VGLAbort(int arg __unused)
VGLAbort(int arg)
{
sigset_t mask;
VGLAbortPending = 1;
signal(SIGINT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
signal(SIGSEGV, SIG_IGN);
signal(SIGBUS, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
if (arg == SIGBUS || arg == SIGSEGV) {
signal(arg, SIG_DFL);
sigemptyset(&mask);
sigaddset(&mask, arg);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
VGLEnd();
kill(getpid(), arg);
}
}
static void