mirror of https://github.com/xqemu/xqemu.git
linux-user: Block signals during sigaction() handling
Block signals while emulating sigaction. This is a non-interruptible syscall, and using block_signals() avoids races where the host signal handler is invoked and tries to examine the signal handler data structures while we are updating them. Signed-off-by: Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk> Message-id: 1441497448-32489-29-git-send-email-T.E.Baldwin99@members.leeds.ac.uk [PMM: expanded commit message] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
655ed67c2a
commit
ef6a778ea2
|
@ -640,7 +640,7 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do_sigaction() return host values and errnos */
|
/* do_sigaction() return target values and host errnos */
|
||||||
int do_sigaction(int sig, const struct target_sigaction *act,
|
int do_sigaction(int sig, const struct target_sigaction *act,
|
||||||
struct target_sigaction *oact)
|
struct target_sigaction *oact)
|
||||||
{
|
{
|
||||||
|
@ -649,8 +649,14 @@ int do_sigaction(int sig, const struct target_sigaction *act,
|
||||||
int host_sig;
|
int host_sig;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)
|
if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
|
||||||
return -EINVAL;
|
return -TARGET_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block_signals()) {
|
||||||
|
return -TARGET_ERESTARTSYS;
|
||||||
|
}
|
||||||
|
|
||||||
k = &sigact_table[sig - 1];
|
k = &sigact_table[sig - 1];
|
||||||
if (oact) {
|
if (oact) {
|
||||||
__put_user(k->_sa_handler, &oact->_sa_handler);
|
__put_user(k->_sa_handler, &oact->_sa_handler);
|
||||||
|
|
Loading…
Reference in New Issue