]> granicus.if.org Git - procps-ng/commitdiff
top: avoid a potential SEGV during program termination
authorJim Warner <james.warner@comcast.net>
Tue, 6 Aug 2019 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@enc.com.au>
Sun, 25 Aug 2019 00:35:50 +0000 (10:35 +1000)
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>
top/top.c

index b01907a360e631d6ab62a62587785e61eb4ad953..73598e265961a4b41296390b07e822c062d7dab6 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -404,6 +404,11 @@ static void at_eoj (void) {
          * The real program end */
 static void bye_bye (const char *str) 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
 {  proc_t *p;
@@ -595,12 +600,6 @@ static void sig_abexit (int sig) {
          *    SIGUSR1 and SIGUSR2 */
 static void sig_endpgm (int dont_care_sig) 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