|
Zbigniew Jędrzejewski-Szmek |
5d6eed |
From 92f6078aeadec4dfd0e4e9e2ef14b0f7794141cc Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
From: Andrey Ulanov <aulanov@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Date: Mon, 12 Dec 2016 17:38:18 -0800
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Subject: [PATCH] nspawn: when getting SIGCHLD make sure it's from the first
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
child (#4855)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
When getting SIGCHLD we should not assume that it was the first
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
child forked from system-nspawn that has died as it may also be coming
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
from an orphan process. This change adds a signal handler that ignores
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
SIGCHLD unless it came from the first containerized child - the real
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
child.
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Before this change the problem can be reproduced as follows:
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
$ sudo systemd-nspawn --directory=/container-root --share-system
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Press ^] three times within 1s to kill container.
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
[root@andreyu-coreos ~]# { true & } &
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
[1] 22201
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
[root@andreyu-coreos ~]#
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
Container root-fedora-latest terminated by signal KILL
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
(cherry picked from commit 6916b164642d8bb4938878f4284f8ee5ccf3efd6)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
---
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
src/nspawn/nspawn.c | 25 +++++++++++++++++++++++--
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
1 file changed, 23 insertions(+), 2 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
index 81573be95a..503265545b 100644
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
--- a/src/nspawn/nspawn.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+++ b/src/nspawn/nspawn.c
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -38,6 +38,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
#include <sys/personality.h>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
#include <sys/prctl.h>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
#include <sys/types.h>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+#include <sys/wait.h>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
#include <unistd.h>
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
#include "sd-daemon.h"
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -2538,6 +2539,26 @@ static int on_orderly_shutdown(sd_event_source *s, const struct signalfd_siginfo
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
}
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+static int on_sigchld(sd_event_source *s, const struct signalfd_siginfo *ssi, void *userdata) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ for (;;) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ siginfo_t si = {};
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ if (waitid(P_ALL, 0, &si, WNOHANG|WNOWAIT|WEXITED) < 0)
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ return log_error_errno(errno, "Failed to waitid(): %m");
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ if (si.si_pid == 0) /* No pending children. */
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ if (si.si_pid == PTR_TO_PID(userdata)) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ /* The main process we care for has exited. Return from
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ * signal handler but leave the zombie. */
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ sd_event_exit(sd_event_source_get_event(s), 0);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ /* Reap all other children. */
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ (void) waitid(P_PID, si.si_pid, &si, WNOHANG|WEXITED);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ return 0;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
static int determine_names(void) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
@@ -3952,8 +3973,8 @@ static int run(int master,
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
}
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
- /* simply exit on sigchld */
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
- sd_event_add_signal(event, NULL, SIGCHLD, NULL, NULL);
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ /* Exit when the child exits */
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
+ sd_event_add_signal(event, NULL, SIGCHLD, on_sigchld, PID_TO_PTR(*pid));
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
if (arg_expose_ports) {
|
|
Zbigniew Jędrzejewski-Szmek |
03e93e |
r = expose_port_watch_rtnl(event, rtnl_socket_pair[0], on_address_change, exposed, &rtnl);
|