This patchset fixes bugs in our handling of failure to read or write guest memory on entry and exit from a signal handler. This is supposed to cause a SIGSEGV, but the guest is permitted a chance to handle the SIGSEGV (assuming it wasn't generated in the course of trying to enter a SIGSEGV handler in the first place). Our current implementation makes the SIGSEGV always fatal, regardless of whether the guest had a signal handler set up for it.
The main cause of this bug is that our implementation of force_sig() had drifted away from the semantics of the kernel function of that name, so the series renames that to dump_core_and_abort(), and provides a force_sig() that just queues a synchronous signal to be taken in the usual way. The patchset sits on top of my various other pending linux-user fixes. There are getting to be quite a lot of those now, so you can find them and this patchset at: https://git.linaro.org/people/peter.maydell/qemu-arm.git linux-fixes The test program I used is at http://people.linaro.org/~peter.maydell/sigaltstack.c (NB: contains a magic constant that will need tweaking for non-x86 guests); it arranges to take a SIGSEGV while trying to take a SIGUSR1. Although this is a bugfix, it's for a fairly obscure corner case, so we might want to defer this to 2.8. thanks -- PMM Peter Maydell (6): linux-user: Recheck for pending synchronous signals too linux-user: Pass si_type information to queue_signal() explicitly linux-user: SIGSEGV on signal entry need not be fatal linux-user: ARM: Give SIGSEGV if signal frame setup fails linux-user: SIGSEGV from sigreturn need not be fatal linux-user: Implement force_sigsegv() via force_sig() linux-user/main.c | 124 ++++++++++++++++----------------- linux-user/qemu.h | 3 +- linux-user/signal.c | 189 ++++++++++++++++++++++++++++++--------------------- linux-user/syscall.c | 6 +- 4 files changed, 180 insertions(+), 142 deletions(-) -- 1.9.1