Gentoo Archives: gentoo-commits

From: William Hubbs <williamh@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/openrc:master commit in: src/rc/
Date: Thu, 13 Apr 2017 17:56:13
Message-Id: 1492106070.4694900190a9078397bb9083328b68b489af92f4.williamh@OpenRC
1 commit: 4694900190a9078397bb9083328b68b489af92f4
2 Author: William Hubbs <w.d.hubbs <AT> gmail <DOT> com>
3 AuthorDate: Thu Apr 13 17:54:18 2017 +0000
4 Commit: William Hubbs <williamh <AT> gentoo <DOT> org>
5 CommitDate: Thu Apr 13 17:54:30 2017 +0000
6 URL: https://gitweb.gentoo.org/proj/openrc.git/commit/?id=46949001
7
8 init: fix signal handling
9
10 The only signals we handle are SIGINT and SIGCHLD, so block all others
11 and unblock them in the child process before we start a rurnlevel.
12
13 src/rc/openrc-init.c | 20 +++++++++++++++++---
14 1 file changed, 17 insertions(+), 3 deletions(-)
15
16 diff --git a/src/rc/openrc-init.c b/src/rc/openrc-init.c
17 index 61052806..621c81ea 100644
18 --- a/src/rc/openrc-init.c
19 +++ b/src/rc/openrc-init.c
20 @@ -39,6 +39,7 @@ static const char *rc_default_runlevel = "default";
21 static pid_t do_openrc(const char *runlevel)
22 {
23 pid_t pid;
24 + sigset_t signals;
25
26 pid = fork();
27 switch(pid) {
28 @@ -47,6 +48,9 @@ static pid_t do_openrc(const char *runlevel)
29 break;
30 case 0:
31 setsid();
32 + /* unblock all signals */
33 + sigemptyset(&signals);
34 + sigprocmask(SIG_SETMASK, &signals, NULL);
35 printf("Starting %s runlevel\n", runlevel);
36 execl("/sbin/openrc", "/sbin/openrc", runlevel, NULL);
37 perror("exec");
38 @@ -135,11 +139,14 @@ int main(int argc, char **argv)
39 int count;
40 FILE *fifo;
41 bool reexec = false;
42 + sigset_t signals;
43 struct sigaction sa;
44
45 if (getpid() != 1)
46 return 1;
47
48 + printf("OpenRC init version %s starting\n", VERSION);
49 +
50 if (argc > 1)
51 default_runlevel = argv[1];
52 else
53 @@ -148,15 +155,22 @@ int main(int argc, char **argv)
54 if (default_runlevel && strcmp(default_runlevel, "reexec") == 0)
55 reexec = true;
56
57 - printf("OpenRC init version %s starting\n", VERSION);
58 - if (! reexec)
59 - init(default_runlevel);
60 + /* block all signals we do not handle */
61 + sigfillset(&signals);
62 + sigdelset(&signals, SIGCHLD);
63 + sigdelset(&signals, SIGINT);
64 + sigprocmask(SIG_SETMASK, &signals, NULL);
65 +
66 + /* install signal handler */
67 memset(&sa, 0, sizeof(sa));
68 sa.sa_handler = signal_handler;
69 sigaction(SIGCHLD, &sa, NULL);
70 sigaction(SIGINT, &sa, NULL);
71 reboot(RB_DISABLE_CAD);
72
73 + if (! reexec)
74 + init(default_runlevel);
75 +
76 if (mkfifo(RC_INIT_FIFO, 0600) == -1 && errno != EEXIST)
77 perror("mkfifo");