From e0529a5597103025bff5e350a40049b1b11ef047 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sun, 18 Jan 2015 21:35:51 +0100 Subject: [PATCH] Unblock all signals blocked by finit when starting children Signed-off-by: Joachim Nilsson --- helpers.c | 14 +++++--------- sig.c | 23 +++++++++++++++++++++++ sig.h | 1 + 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/helpers.c b/helpers.c index 072b9be2..942392cd 100644 --- a/helpers.c +++ b/helpers.c @@ -466,7 +466,9 @@ int run(char *cmd) dup2(fd, STDERR_FILENO); } + sig_unblock(); execvp(args[0], args); + _exit(1); /* Only if execv() fails. */ } else if (-1 == pid) { _pe("%s", args[0]); @@ -566,10 +568,8 @@ pid_t run_getty(char *cmd, char *args[], int console) pid_t pid = vfork(); if (!pid) { - int i, fd; + int fd; char c; - sigset_t nmask; - struct sigaction sa; if (console) { /* Detach from initial controlling TTY */ @@ -590,13 +590,8 @@ pid_t run_getty(char *cmd, char *args[], int console) prctl(PR_SET_NAME, "console", 0, 0, 0); } - sigemptyset(&nmask); - sigaddset(&nmask, SIGCHLD); - sigprocmask(SIG_UNBLOCK, &nmask, NULL); - /* Reset signal handlers that were set by the parent process */ - for (i = 1; i < NSIG; i++) - DFLSIG(sa, i, 0); + sig_unblock(); while (!fexist(SYNC_SHUTDOWN)) { static const char msg[] = "\nPlease press Enter to activate this console."; @@ -672,6 +667,7 @@ int run_parts(char *dir, char *cmd) pid = vfork(); if (!pid) { _d("Calling %s ...", path); + sig_unblock(); execv(path, args); exit(0); } diff --git a/sig.c b/sig.c index da7b7cf1..a9e2b35b 100644 --- a/sig.c +++ b/sig.c @@ -148,6 +148,29 @@ void sig_init(void) SETSIG(sa, SIGCHLD, chld_handler, SA_RESTART); } +/* + * Unblock all signals blocked by finit when starting children + */ +void sig_unblock(void) +{ + int i; + sigset_t nmask; + struct sigaction sa; + + sigemptyset(&nmask); + sigaddset(&nmask, SIGCHLD); + sigaddset(&nmask, SIGINT); + sigaddset(&nmask, SIGPWR); + sigaddset(&nmask, SIGSTOP); + sigaddset(&nmask, SIGTSTP); + sigaddset(&nmask, SIGCONT); + sigprocmask(SIG_UNBLOCK, &nmask, NULL); + + /* Reset signal handlers that were set by the parent process */ + for (i = 1; i < NSIG; i++) + DFLSIG(sa, i, 0); +} + /* * Setup limited set of SysV compatible signals to respond to */ diff --git a/sig.h b/sig.h index e452db5b..1153a865 100644 --- a/sig.h +++ b/sig.h @@ -58,6 +58,7 @@ void do_shutdown (int sig); int sig_stopped (void); void sig_init (void); +void sig_unblock (void); void sig_setup (uev_ctx_t *ctx); #endif /* FINIT_SIG_H_ */