2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-22 09:58:09 +00:00

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 <avagin@virtuozzo.com>
Reviewed-by: Dmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This commit is contained in:
Andrei Vagin 2016-09-16 12:18:39 +03:00 committed by Pavel Emelyanov
parent 357c78f8f7
commit 3a61c38a58
2 changed files with 15 additions and 0 deletions

View File

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

View File

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