[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 12/19] linux-user: Block signals during sigaction
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PATCH v2 12/19] linux-user: Block signals during sigaction() handling |
Date: |
Fri, 27 May 2016 15:51:54 +0100 |
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>
---
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);
--
1.9.1
- [Qemu-devel] [PATCH v2 00/19] linux-user: fix various signal race conditions, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 16/19] linux-user: Restart fork() if signals pending, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 18/19] linux-user: Avoid possible misalignment in host_to_target_siginfo(), Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 14/19] linux-user: Restart exit() if signal pending, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 11/19] linux-user: Queue synchronous signals separately, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 12/19] linux-user: Block signals during sigaction() handling,
Peter Maydell <=
- [Qemu-devel] [PATCH v2 13/19] linux-user: pause() should not pause if signal pending, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 03/19] linux-user: Fix stray tab-indent, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 09/19] linux-user: Remove redundant gdb_queuesig(), Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 08/19] linux-user: Remove redundant default action check in queue_signal(), Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 10/19] linux-user: Remove real-time signal queuing, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 06/19] linux-user: Use safe_syscall for sigsuspend syscalls, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 05/19] linux-user: Define macro for size of host kernel sigset_t, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 07/19] linux-user: Fix race between multiple signals, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 02/19] linux-user: Move handle_pending_signal() to avoid need for declaration, Peter Maydell, 2016/05/27
- [Qemu-devel] [PATCH v2 01/19] linux-user: Factor out handle_signal code from process_pending_signals(), Peter Maydell, 2016/05/27