From 4e7affd3279ad12a8318b62e3f8729545bfae4d2 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 11 Nov 2003 05:18:50 -0800 Subject: [PATCH] Always disable system call restart when invoking a signal handler. Otherwise, a restarted system call that gets interrupted before the restart has taken effect by _another_ signal will potentially restart the wrong system call. --- arch/i386/kernel/signal.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 234f513779a82..0fcb9627050b2 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -504,12 +504,14 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset, { struct k_sigaction *ka = ¤t->sighand->action[sig-1]; + /* Always make any pending restarted system calls return -EINTR */ + current_thread_info()->restart_block.fn = do_no_restart_syscall; + /* Are we from a system call? */ if (regs->orig_eax >= 0) { /* If so, check system call restarting.. */ switch (regs->eax) { case -ERESTART_RESTARTBLOCK: - current_thread_info()->restart_block.fn = do_no_restart_syscall; case -ERESTARTNOHAND: regs->eax = -EINTR; break; -- 2.53.0