[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 00/34] linux-user: Fix signal race conditions and SA
From: |
Timothy E Baldwin |
Subject: |
[Qemu-devel] [PATCH 00/34] linux-user: Fix signal race conditions and SA_RESTART |
Date: |
Sun, 6 Sep 2015 00:56:54 +0100 |
There are many races with signals in linux user:
- Multiple host signals in quick succession, fixed by keeping host signals
blocked, and checking if target signals are blocked before calling
target signal handler.
- Signal shortly before blocking system call, fixed by either:
- Block hosts signals, check and use host system call with
sigset_t parameter.
- Or check if signals are pending immediately before host system call
and if a signal arrives between the check and system call rewind
host instruction pointer to before the check. Also fixes SA_RESTART.
- Signal before or during sensitive system call, fixed in a similar manner.
- Close host and synchronous signals, partly fixed by implementing a separate
queue for synchronous signals which are dispatched first. The asynchronous
signal may still be delayed or lost rather than dispatched to another thread
or handled after exec().
Also fixed:
- Errno array bounds.
- Default fatal actions occurring in the middle of target instructions.
I have major problems testing the system call restarting:
- x86, ARM MIPS, PowerPC and SPARC sucessful tested.
- Microblaze and SH4 works without signals, but signal test case
crashes with or without my changes.
- Alpha works without signals, but don't have a toolchain.
to compile the signal test case.
- I have been unable to test UniCore32, OpenRISC, M68K, S390
and CRIS due to a lack of binaries and toolchains.
Help would be appreciated - this is the only change I intend to make
to unshared code to all targets.
Outstanding issues:
- The remaining blocking target system calls.
- Fatal default actions may be delayed in a broken blocking target
system call.
Timothy E Baldwin (34):
linux-user: Fix array bounds in errno conversion
linux-user: Reindent signal handling
linux-user: Support for restarting system calls
linux-user: Support for restarting system calls for x86 targets
linux-user: Support for restarting system calls for ARM targets
linux-user: Support for restarting system calls for MIPS targets
linux-user: Support for restarting system calls for PPC targets
linux-user: Support for restarting system calls for SPARC targets
linux-user: Test for restarting system calls
linux-user: Support for restarting system calls for Microblaze targets
linux-user: Support for restarting system calls for SH4 targets
linux-user: Support for restarting system calls for APLHA targets
linux-user: Fix signal before blocking system calls race and
SA_RESTART
linux-user: Use safe_syscall for read and write system calls
linux-user: Remove redundant get_errno() calls
linux-user: Use safe_syscall for open and openat system calls
linux-user: Use safe_syscall for wait system calls
linux-user: Fix race between multiple signals
linux-user: Restart fork() if signals pending
linux-user: Remove redundant default action check in queue_signal()
linux-user: Remove redundant gdb_queuesig()
linux-user: Remove real-time signal queuing
linux-user: Queue synchronous signals separately
linux-user: Restart execve() if signal pending
linux-user: Restart exit() if signal pending
linux-user: Restart kill() if signal pending
linux-user: pause() should not pause if signal pending
linux-user: Restart sigaction() if signal pending
linux-user: Support for restarting system calls for UniCore32 targets
linux-user: Support for restarting system calls for OpenRISC targets
linux-user: Support for restarting system calls for M68K targets
linux-user: Support for restarting system calls for S390 targets
linux-user: Support for restarting system calls for CRIS targets
linux-user: Remove TARGET_USE_ERESTARTSYS
configure | 13 +
gdbstub.c | 13 -
include/exec/gdbstub.h | 1 -
linux-user/Makefile.objs | 3 +-
linux-user/errno_defs.h | 3 +
linux-user/main.c | 210 ++--
linux-user/mips/syscall.h | 4 -
linux-user/mips64/syscall.h | 4 -
linux-user/ppc/syscall.h | 2 -
linux-user/qemu.h | 37 +-
linux-user/safe_syscall/x86_64.S | 34 +
linux-user/signal.c | 2012 +++++++++++++++++++-------------------
linux-user/syscall.c | 247 ++++-
13 files changed, 1422 insertions(+), 1161 deletions(-)
create mode 100644 linux-user/safe_syscall/x86_64.S
--
2.1.4
- [Qemu-devel] [PATCH 00/34] linux-user: Fix signal race conditions and SA_RESTART,
Timothy E Baldwin <=
- [Qemu-devel] [PATCH 01/34] linux-user: Fix array bounds in errno conversion, Timothy E Baldwin, 2015/09/05
- [Qemu-devel] [PATCH 04/34] linux-user: Support for restarting system calls for x86 targets, Timothy E Baldwin, 2015/09/05
- [Qemu-devel] [PATCH 06/34] linux-user: Support for restarting system calls for MIPS targets, Timothy E Baldwin, 2015/09/05
- [Qemu-devel] [PATCH 03/34] linux-user: Support for restarting system calls, Timothy E Baldwin, 2015/09/05
- [Qemu-devel] [PATCH 09/34] linux-user: Test for restarting system calls, Timothy E Baldwin, 2015/09/05