Author: bde Date: Fri Mar 29 15:57:08 2019 New Revision: 345696 URL: https://svnweb.freebsd.org/changeset/base/345696
Log: 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. Modified: head/lib/libvgl/main.c Modified: head/lib/libvgl/main.c ============================================================================== --- head/lib/libvgl/main.c Fri Mar 29 15:20:48 2019 (r345695) +++ head/lib/libvgl/main.c Fri Mar 29 15:57:08 2019 (r345696) @@ -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 _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"