From 3a61c38a5832c99f973be0aaad8ff7526bf88f2f Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Fri, 16 Sep 2016 12:18:39 +0300 Subject: [PATCH] restore: block sigchld to remap task_entries Currently we remap task_entries but it can be used from a sigchld hanler. We need to block sigchld to remap task_entries and unlock it when a restorer sigchld handler is set. Signed-off-by: Andrei Vagin Reviewed-by: Dmitry Safonov Signed-off-by: Pavel Emelyanov --- criu/cr-restore.c | 11 +++++++++++ criu/pie/restorer.c | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/criu/cr-restore.c b/criu/cr-restore.c index 9f4c1f423..4a1ba88ac 100644 --- a/criu/cr-restore.c +++ b/criu/cr-restore.c @@ -2754,6 +2754,8 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns unsigned long creds_pos = 0; unsigned long creds_pos_next; + sigset_t blockmask; + pr_info("Restore via sigreturn\n"); /* pr_info_vma_list(&self_vma_list); */ @@ -2881,6 +2883,15 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns } task_args->breakpoint = &rsti(current)->breakpoint; + + sigemptyset(&blockmask); + sigaddset(&blockmask, SIGCHLD); + + if (sigprocmask(SIG_BLOCK, &blockmask, NULL) == -1) { + pr_perror("Can not set mask of blocked signals"); + return -1; + } + task_args->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP); task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr; diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c index 8e0fcbb9f..6b4bbb501 100644 --- a/criu/pie/restorer.c +++ b/criu/pie/restorer.c @@ -1054,6 +1054,10 @@ long __export_restore_task(struct task_restore_args *args) act.rt_sa_restorer = cr_restore_rt; sys_sigaction(SIGCHLD, &act, NULL, sizeof(k_rtsigset_t)); + ksigfillset(&to_block); + ksigaddset(&to_block, SIGCHLD); + ret = sys_sigprocmask(SIG_UNBLOCK, &to_block, NULL, sizeof(k_rtsigset_t)); + log_set_fd(args->logfd); log_set_loglevel(args->loglevel);