From c0e4ccd03227c38d92a9fb02f65a28e83bdb9f41 Mon Sep 17 00:00:00 2001 From: Tobias Stoeckmann Date: Sat, 23 Oct 2021 15:36:00 +0200 Subject: [PATCH] Verify default SIGCHLD handling. The SIGCHLD handler could have been ignored by parent process. Make sure that we have default handling activated. Signed-off-by: Tobias Stoeckmann --- src/su.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/su.c b/src/su.c index 02c5b0be9..58882caf0 100644 --- a/src/su.c +++ b/src/su.c @@ -295,6 +295,21 @@ static void prepare_pam_close_session (void) sigset_t ourset; int status; int ret; + struct sigaction action; + + /* reset SIGCHLD handling to default */ + action.sa_handler = SIG_DFL; + sigemptyset (&action.sa_mask); + action.sa_flags = 0; + if (0 == caught && sigaction (SIGCHLD, &action, NULL) != 0) { + fprintf (stderr, + _("%s: signal masking malfunction\n"), + Prog); + SYSLOG ((LOG_WARN, "Will not execute %s", shellstr)); + closelog (); + exit (1); + /* Only the child returns. See above. */ + } pid_child = fork (); if (pid_child == 0) { /* child shell */ @@ -318,11 +333,7 @@ static void prepare_pam_close_session (void) caught = SIGTERM; } if (0 == caught) { - struct sigaction action; - action.sa_handler = catch_signals; - sigemptyset (&action.sa_mask); - action.sa_flags = 0; sigemptyset (&ourset); if ( (sigaddset (&ourset, SIGTERM) != 0)