Commit 3a61c38a authored by Andrei Vagin's avatar Andrei Vagin Committed by Pavel Emelyanov

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: 's avatarAndrei Vagin <avagin@virtuozzo.com>
Reviewed-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 357c78f8
...@@ -2754,6 +2754,8 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns ...@@ -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 = 0;
unsigned long creds_pos_next; unsigned long creds_pos_next;
sigset_t blockmask;
pr_info("Restore via sigreturn\n"); pr_info("Restore via sigreturn\n");
/* pr_info_vma_list(&self_vma_list); */ /* 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 ...@@ -2881,6 +2883,15 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
} }
task_args->breakpoint = &rsti(current)->breakpoint; 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->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP);
task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr; task_args->premmapped_addr = (unsigned long)rsti(current)->premmapped_addr;
......
...@@ -1054,6 +1054,10 @@ long __export_restore_task(struct task_restore_args *args) ...@@ -1054,6 +1054,10 @@ long __export_restore_task(struct task_restore_args *args)
act.rt_sa_restorer = cr_restore_rt; act.rt_sa_restorer = cr_restore_rt;
sys_sigaction(SIGCHLD, &act, NULL, sizeof(k_rtsigset_t)); 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_fd(args->logfd);
log_set_loglevel(args->loglevel); log_set_loglevel(args->loglevel);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment