-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun-init-reset-signals.patch
52 lines (50 loc) · 1.16 KB
/
run-init-reset-signals.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
--- kinit/run-init/runinitlib.c.fix10 2014-08-25 16:11:57.000000000 +0400
+++ kinit/run-init/runinitlib.c 2014-08-25 16:42:00.000000000 +0400
@@ -46,8 +46,9 @@
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include <signal.h>
#include <unistd.h>
#include <sys/mount.h>
#include <sys/param.h>
#include <sys/stat.h>
@@ -192,8 +193,28 @@ end:
fclose(fp);
return rc;
}
+static void reset_signals(void)
+{
+ sigset_t sgt;
+ struct sigaction sa;
+ int sig;
+
+ /* Reset all the signals */
+ for(sig = 1; sig < NSIG; sig++) {
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = SIG_DFL;
+ sa.sa_flags = SA_RESTART;
+ sigemptyset(&sa.sa_mask);
+ sigaction(sig, &sa, NULL);
+ }
+
+ sigemptyset (&sgt);
+ sigfillset(&sgt);
+ sigprocmask(SIG_UNBLOCK, &sgt, NULL);
+}
+
const char *run_init(const char *realroot, const char *console, const char *envfile,
const char *init, char **initargs)
{
struct stat rst, cst;
@@ -257,8 +278,10 @@ const char *run_init(const char *realroo
maxfd--;
while (maxfd > 2)
close(maxfd--);
+ reset_signals();
+
/* Spawn init */
execv(init, initargs);
return init; /* Failed to spawn init */
}