Commit 0272e3e6 authored by Pavel Emelyanov's avatar Pavel Emelyanov

sigframe: Use blkset from ctl

When constructing sigframe for parasite, we my use ctl's blkset,
not the CoreEntry's one. This simplifies further patching.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 25a1acd8
......@@ -2934,6 +2934,7 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
for (i = 0; i < current->nr_threads; i++) {
CoreEntry *tcore;
struct rt_sigframe *sigframe;
k_rtsigset_t *blkset = NULL;
thread_args[i].pid = current->threads[i].virt;
thread_args[i].siginfo_n = siginfo_priv_nr[i];
......@@ -2945,8 +2946,12 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
if (thread_args[i].pid == pid) {
task_args->t = thread_args + i;
tcore = core;
} else
blkset = (void *)&tcore->tc->blk_sigset;
} else {
tcore = current->core[i];
if (tcore->thread_core->has_blk_sigset)
blkset = (void *)&tcore->thread_core->blk_sigset;
}
if ((tcore->tc || tcore->ids) && thread_args[i].pid != pid) {
pr_err("Thread has optional fields present %d\n",
......@@ -2983,7 +2988,7 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
thread_args[i].mz = mz + i;
sigframe = (struct rt_sigframe *)&mz[i].rt_sigframe;
if (construct_sigframe(sigframe, sigframe, tcore))
if (construct_sigframe(sigframe, sigframe, blkset, tcore))
goto err;
if (thread_args[i].pid != pid)
......
......@@ -52,6 +52,7 @@ struct rt_ucontext {
extern int construct_sigframe(struct rt_sigframe *sigframe,
struct rt_sigframe *rsigframe,
k_rtsigset_t *blkset,
CoreEntry *core);
#endif /* __CR_SIGFRAME_H__ */
......@@ -1347,7 +1347,7 @@ static int parasite_start_daemon(struct parasite_ctl *ctl, struct pstree_item *i
return -1;
}
if (construct_sigframe(ctl->sigframe, ctl->rsigframe, item->core[0]))
if (construct_sigframe(ctl->sigframe, ctl->rsigframe, &ctl->orig.sigmask, item->core[0]))
return -1;
if (parasite_init_daemon(ctl, dmpi(item)->netns))
......
......@@ -23,6 +23,7 @@ static inline void setup_sas(struct rt_sigframe* sigframe, ThreadSasEntry *sas)
int construct_sigframe(struct rt_sigframe *sigframe,
struct rt_sigframe *rsigframe,
k_rtsigset_t *blkset,
CoreEntry *core)
{
k_rtsigset_t *blk_sigset = RT_SIGFRAME_UC_SIGMASK(sigframe);
......@@ -30,12 +31,9 @@ int construct_sigframe(struct rt_sigframe *sigframe,
if (restore_gpregs(sigframe, CORE_THREAD_ARCH_INFO(core)->gpregs))
return -1;
if (core->tc)
memcpy(blk_sigset, &core->tc->blk_sigset, sizeof(k_rtsigset_t));
else if (core->thread_core->has_blk_sigset) {
memcpy(blk_sigset,
&core->thread_core->blk_sigset, sizeof(k_rtsigset_t));
} else
if (blkset)
memcpy(blk_sigset, blkset, sizeof(k_rtsigset_t));
else
memset(blk_sigset, 0, sizeof(k_rtsigset_t));
if (restore_fpu(sigframe, core))
......
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