summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2010-09-26 20:28:42 +0200
committerLinus Torvalds <torvalds@linux-foundation.org>2010-09-27 21:19:53 +0200
commit00cbf6080c7d60b999864afcd9010e0bbc7c5db6 (patch)
tree19ee4371be3b21d3de8cf1cfb539776ce8387c54 /arch
parentmn10300: avoid SIGSEGV delivery loop (diff)
downloadlinux-00cbf6080c7d60b999864afcd9010e0bbc7c5db6.tar.xz
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.c12
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;
}
}