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