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"); |