From: Karel Zak Date: Thu, 7 Sep 2017 08:31:21 +0000 (+0200) Subject: su: (pty) fix child signal mask usage X-Git-Tag: v2.31-rc1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0214f438a6591e9b3b09e3f02329677f1b815223;p=thirdparty%2Futil-linux.git su: (pty) fix child signal mask usage The signal mask is used by pty_init_slave(), but it has never been uninitialized before fork(), so child gets 0 as a mask :-( Note that script(1) has no this issue because it opens signal-fd before fork(). Reported-by: Vaclav Dolezal Signed-off-by: Karel Zak --- diff --git a/login-utils/su-common.c b/login-utils/su-common.c index 520ecb3421..bfccb4643e 100644 --- a/login-utils/su-common.c +++ b/login-utils/su-common.c @@ -135,7 +135,6 @@ struct su_context { pid_t child; /* fork() baby */ struct sigaction oldact[SIGNALS_IDX_COUNT]; /* original sigactions indexed by SIG*_IDX */ - sigset_t oldsig; /* original signal mask */ #ifdef USE_PTY struct termios stdin_attrs; /* stdin and slave terminal runtime attributes */ @@ -144,6 +143,7 @@ struct su_context { int pty_sigfd; /* signalfd() */ int poll_timeout; struct winsize win; /* terminal window size */ + sigset_t oldsig; /* original signal mask */ #endif unsigned int runuser :1, /* flase=su, true=runuser */ runuser_uopt :1, /* runuser -u specified */ @@ -460,7 +460,7 @@ static void pty_proxy_master(struct su_context *su) * TODO: script(1) initializes this FD before fork, good or bad idea? */ sigfillset(&ourset); - if (sigprocmask(SIG_BLOCK, &ourset, &su->oldsig)) { + if (sigprocmask(SIG_BLOCK, &ourset, NULL)) { warn(_("cannot block signals")); caught_signal = true; return; @@ -735,7 +735,7 @@ static void parent_setup_signals(struct su_context *su) DBG(SIG, ul_debug("initialize signals")); sigfillset(&ourset); - if (sigprocmask(SIG_BLOCK, &ourset, &su->oldsig)) { + if (sigprocmask(SIG_BLOCK, &ourset, NULL)) { warn(_("cannot block signals")); caught_signal = true; } @@ -800,6 +800,9 @@ static void create_watching_parent(struct su_context *su) DBG(MISC, ul_debug("forking...")); #ifdef USE_PTY + /* no-op, just save original signal mask to oldsig */ + sigprocmask(SIG_BLOCK, NULL, &su->oldsig); + if (su->pty) pty_create(su); #endif