diff options
author | Jean PIHET <jpihet@mvista.com> | 2009-11-23 17:03:32 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-11-23 17:28:23 +0000 |
commit | 3336f4f08e0dad7a2b6493c80b49b685141d53ad (patch) | |
tree | 803eba990a210afc012f92c3ace18ec9ad43cc80 /arch | |
parent | cefbf4ea629427af2fb4709bab9fe126dcddc234 (diff) | |
download | op-kernel-dev-3336f4f08e0dad7a2b6493c80b49b685141d53ad.zip op-kernel-dev-3336f4f08e0dad7a2b6493c80b49b685141d53ad.tar.gz |
ARM: 5793/1: ARM: Check put_user fail in do_signal when enable OABI_COMPAT
Using OABI, the call to put_user in do_signal can fail causing the
calling app to hang.
The solution is to check if put_user fails and force the app to
seg fault in that case.
Tested with multiple sleeping apps/threads (using the nanosleep syscall)
and suspend/resume.
Signed-off-by: janboe <janboe.ye at gmail.com>
Signed-off-by: Jean Pihet <jpihet@mvista.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/kernel/signal.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 2a573d4..e7714f3 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -662,8 +662,12 @@ static void do_signal(struct pt_regs *regs, int syscall) regs->ARM_sp -= 4; usp = (u32 __user *)regs->ARM_sp; - put_user(regs->ARM_pc, usp); - regs->ARM_pc = KERN_RESTART_CODE; + if (put_user(regs->ARM_pc, usp) == 0) { + regs->ARM_pc = KERN_RESTART_CODE; + } else { + regs->ARM_sp += 4; + force_sigsegv(0, current); + } #endif } } |