[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 17/44] linux-user: Block signals during sigaction() h
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 17/44] linux-user: Block signals during sigaction() handling |
Date: |
Wed, 8 Jun 2016 16:29:58 +0300 |
From: Timothy E Baldwin <address@hidden>
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 <address@hidden>
Message-id: address@hidden
[PMM: expanded commit message]
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/signal.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index f489028..b21d6bf 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -640,7 +640,7 @@ out:
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,
struct target_sigaction *oact)
{
@@ -649,8 +649,14 @@ int do_sigaction(int sig, const struct target_sigaction
*act,
int host_sig;
int ret = 0;
- if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig ==
TARGET_SIGSTOP)
- return -EINVAL;
+ if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig ==
TARGET_SIGSTOP) {
+ return -TARGET_EINVAL;
+ }
+
+ if (block_signals()) {
+ return -TARGET_ERESTARTSYS;
+ }
+
k = &sigact_table[sig - 1];
if (oact) {
__put_user(k->_sa_handler, &oact->_sa_handler);
--
2.1.4
- [Qemu-devel] [PULL 05/44] linux-user: check if NETLINK_ROUTE is available, (continued)
- [Qemu-devel] [PULL 05/44] linux-user: check if NETLINK_ROUTE is available, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 10/44] linux-user: Define macro for size of host kernel sigset_t, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 08/44] linux-user: Fix stray tab-indent, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 09/44] linux-user: Factor out uses of do_sigprocmask() from sigreturn code, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 11/44] linux-user: Use safe_syscall for sigsuspend syscalls, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 13/44] linux-user: Remove redundant default action check in queue_signal(), riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 18/44] linux-user: pause() should not pause if signal pending, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 14/44] linux-user: Remove redundant gdb_queuesig(), riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 12/44] linux-user: Fix race between multiple signals, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 16/44] linux-user: Queue synchronous signals separately, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 17/44] linux-user: Block signals during sigaction() handling,
riku . voipio <=
- [Qemu-devel] [PULL 24/44] linux-user: provide frame information in x86-64 safe_syscall, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 15/44] linux-user: Remove real-time signal queuing, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 23/44] linux-user: Avoid possible misalignment in target_to_host_siginfo(), riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 19/44] linux-user: Restart exit() if signal pending, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 20/44] linux-user: Use safe_syscall for kill, tkill and tgkill syscalls, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 25/44] linux-user: Fix handling of arm_fadvise64_64 syscall, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 21/44] linux-user: Restart fork() if signals pending, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 28/44] linux-user: Use safe_syscall wrapper for readv and writev syscalls, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 22/44] linux-user: Use both si_code and si_signo when converting siginfo_t, riku . voipio, 2016/06/08
- [Qemu-devel] [PULL 26/44] linux-user: Fix NR_fadvise64 and NR_fadvise64_64 for 32-bit guests, riku . voipio, 2016/06/08