mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-22 18:07:57 +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:
parent
357c78f8f7
commit
3a61c38a58
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user