[CRIU] [PATCH] [v2] util: block SIGCHLD to run a sub process

Andrei Vagin avagin at openvz.org
Thu Mar 30 11:11:50 PDT 2017


From: Andrei Vagin <avagin at virtuozzo.com>

CRIU sets a sigchld handler and calls waitpid from it,
but when we call a sub-process, we want to wait it

v2: remove a debug code

Cc: Kirill Tkhai <ktkhai at virtuozzo.com>
Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
 criu/util.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/criu/util.c b/criu/util.c
index 558d498..dad9386 100644
--- a/criu/util.c
+++ b/criu/util.c
@@ -1369,6 +1369,7 @@ int open_fd_of_real_pid(pid_t pid, int fd, int flags)
 
 int call_in_child_process(int (*fn)(void *), void *arg)
 {
+	sigset_t blockmask, oldmask;
 	int size, status, ret = -1;
 	char *stack;
 	pid_t pid;
@@ -1379,10 +1380,19 @@ int call_in_child_process(int (*fn)(void *), void *arg)
 		pr_perror("Can't allocate stack");
 		return -1;
 	}
+
+	sigemptyset(&blockmask);
+	sigaddset(&blockmask, SIGCHLD);
+
+	if (sigprocmask(SIG_BLOCK, &blockmask, &oldmask) == -1) {
+		pr_perror("Can not set mask of blocked signals");
+		goto out_munmap;
+	}
+
 	pid = clone(fn, stack + size, CLONE_VM | CLONE_FILES | SIGCHLD, arg);
 	if (pid == -1) {
 		pr_perror("Can't clone");
-		goto out_munmap;
+		goto out_unblock;
 	}
 	errno = 0;
 	if (waitpid(pid, &status, 0) != pid || !WIFEXITED(status) || WEXITSTATUS(status)) {
@@ -1396,6 +1406,11 @@ out_close:
 	 * with the same pid later, it will try to reuse this /proc/self.
 	 */
 	close_pid_proc();
+out_unblock:
+	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) == -1) {
+		pr_perror("Can not unset mask of blocked signals");
+		ret = -1;
+	}
 out_munmap:
 	munmap(stack, size);
 	return ret;
-- 
2.7.4



More information about the CRIU mailing list