diff options
author | 2010-09-26 19:28:42 +0100 | |
---|---|---|
committer | 2010-09-27 12:19:53 -0700 | |
commit | 00cbf6080c7d60b999864afcd9010e0bbc7c5db6 (patch) | |
tree | 19ee4371be3b21d3de8cf1cfb539776ce8387c54 /arch | |
parent | mn10300: avoid SIGSEGV delivery loop (diff) | |
download | linux-00cbf6080c7d60b999864afcd9010e0bbc7c5db6.tar.gz linux-00cbf6080c7d60b999864afcd9010e0bbc7c5db6.tar.bz2 linux-00cbf6080c7d60b999864afcd9010e0bbc7c5db6.zip |
mn10300: prevent double syscall restarts
set ->orig_d0 to -1, same as what sigreturn does
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mn10300/kernel/signal.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index 57178a8d5af0..4ef99256fa49 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c @@ -432,6 +432,12 @@ give_sigsegv: return -EFAULT; } +static inline void stepback(struct pt_regs *regs) +{ + regs->pc -= 2; + regs->orig_d0 = -1; +} + /* * handle the actual delivery of a signal to userspace */ @@ -459,7 +465,7 @@ static int handle_signal(int sig, /* fallthrough */ case -ERESTARTNOINTR: regs->d0 = regs->orig_d0; - regs->pc -= 2; + stepback(regs); } } @@ -527,12 +533,12 @@ static void do_signal(struct pt_regs *regs) case -ERESTARTSYS: case -ERESTARTNOINTR: regs->d0 = regs->orig_d0; - regs->pc -= 2; + stepback(regs); break; case -ERESTART_RESTARTBLOCK: regs->d0 = __NR_restart_syscall; - regs->pc -= 2; + stepback(regs); break; } } |