diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-09-17 14:56:16 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-09-17 14:56:16 +0100 |
commit | b2b163bb82b12bae2504a5b31399c37d099ad3cc (patch) | |
tree | c82f6af3b566b449895e202962d2dc7caed1f20f /arch | |
parent | 1a8e41cd672f894bbd74874eac601e6cedf838fb (diff) | |
download | op-kernel-dev-b2b163bb82b12bae2504a5b31399c37d099ad3cc.zip op-kernel-dev-b2b163bb82b12bae2504a5b31399c37d099ad3cc.tar.gz |
ARM: prevent multiple syscall restarts
Al Viro reports that calling "sys_sigsuspend(-ERESTARTNOHAND, 0, 0)"
with two signals coming and being handled in kernel space results
in the syscall restart being done twice.
Avoid this by clearing the 'why' flag when we call the signal handling
code to prevent further syscall restarts after the first.
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/kernel/entry-common.S | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f05a35a..4a560d3 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -48,6 +48,8 @@ work_pending: beq no_work_pending mov r0, sp @ 'regs' mov r2, why @ 'syscall' + tst r1, #_TIF_SIGPENDING @ delivering a signal? + movne why, #0 @ prevent further restarts bl do_notify_resume b ret_slow_syscall @ Check work again |