From: Tobias Stoeckmann Date: Sat, 23 Oct 2021 13:36:00 +0000 (+0200) Subject: Verify default SIGCHLD handling. X-Git-Tag: 4.10~5^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0e4ccd03227c38d92a9fb02f65a28e83bdb9f41;p=thirdparty%2Fshadow.git 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 --- 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)