commit:     4694900190a9078397bb9083328b68b489af92f4
Author:     William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
AuthorDate: Thu Apr 13 17:54:18 2017 +0000
Commit:     William Hubbs <williamh <AT> gentoo <DOT> org>
CommitDate: Thu Apr 13 17:54:30 2017 +0000
URL:        https://gitweb.gentoo.org/proj/openrc.git/commit/?id=46949001

init: fix signal handling

The only signals we handle are SIGINT and SIGCHLD, so block all others
and unblock them in the child process before we start a rurnlevel.

 src/rc/openrc-init.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/rc/openrc-init.c b/src/rc/openrc-init.c
index 61052806..621c81ea 100644
--- a/src/rc/openrc-init.c
+++ b/src/rc/openrc-init.c
@@ -39,6 +39,7 @@ static const char *rc_default_runlevel = "default";
 static pid_t do_openrc(const char *runlevel)
 {
        pid_t pid;
+       sigset_t signals;
 
        pid = fork();
        switch(pid) {
@@ -47,6 +48,9 @@ static pid_t do_openrc(const char *runlevel)
                        break;
                case 0:
                        setsid();
+                       /* unblock all signals */
+                       sigemptyset(&signals);
+                       sigprocmask(SIG_SETMASK, &signals, NULL);
                        printf("Starting %s runlevel\n", runlevel);
                        execl("/sbin/openrc", "/sbin/openrc", runlevel, NULL);
                        perror("exec");
@@ -135,11 +139,14 @@ int main(int argc, char **argv)
        int count;
        FILE *fifo;
        bool reexec = false;
+       sigset_t signals;
        struct sigaction sa;
 
        if (getpid() != 1)
                return 1;
 
+       printf("OpenRC init version %s starting\n", VERSION);
+
        if (argc > 1)
                default_runlevel = argv[1];
        else
@@ -148,15 +155,22 @@ int main(int argc, char **argv)
        if (default_runlevel && strcmp(default_runlevel, "reexec") == 0)
                reexec = true;
 
-       printf("OpenRC init version %s starting\n", VERSION);
-       if (! reexec)
-               init(default_runlevel);
+       /* block all signals we do not handle */
+       sigfillset(&signals);
+       sigdelset(&signals, SIGCHLD);
+       sigdelset(&signals, SIGINT);
+       sigprocmask(SIG_SETMASK, &signals, NULL);
+
+       /* install signal  handler */
        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = signal_handler;
        sigaction(SIGCHLD, &sa, NULL);
        sigaction(SIGINT, &sa, NULL);
        reboot(RB_DISABLE_CAD);
 
+       if (! reexec)
+               init(default_runlevel);
+
        if (mkfifo(RC_INIT_FIFO, 0600) == -1 && errno != EEXIST)
                perror("mkfifo");
 

Reply via email to