The backtrace shown in the bug report referenced below
illustrates a 'normal' program termination interrupted
with some signal, ultimately then causing a top crash.
So this commit just rearranges a little code such that
all signals will be blocked during that rather lengthy
end of program processing regardless of how initiated.
[ in that report, ignore the assertion regarding the ]
[ '-n' option. it obviously was not '1' since do_key ]
[ had been called, which otherwise wouldn't be true. ]
[ and when it is '1' the -d option would be ignored. ]
Reference(s):
https://bugzilla.redhat.com/show_bug.cgi?id=
1737552
Signed-off-by: Jim Warner <james.warner@comcast.net>
* The real program end */
static void bye_bye (const char *str) __attribute__((__noreturn__));
static void bye_bye (const char *str) {
+ sigset_t ss;
+
+// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask
+ sigfillset(&ss);
+ sigprocmask(SIG_BLOCK, &ss, NULL);
at_eoj(); // restore tty in preparation for exit
#ifdef ATEOJ_RPTSTD
{
* SIGUSR1 and SIGUSR2 */
static void sig_endpgm (int dont_care_sig) __attribute__((__noreturn__));
static void sig_endpgm (int dont_care_sig) {
- sigset_t ss;
-
-// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask
- sigfillset(&ss);
- sigprocmask(SIG_BLOCK, &ss, NULL);
- Frames_signal = BREAK_sig;
bye_bye(NULL);
(void)dont_care_sig;
} // end: sig_endpgm