From 1074ddff72e5ebbc691c2924e747e1787d11d968 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 13 Nov 2003 00:26:25 -0800 Subject: [PATCH] [SPARC]: Port over x86 signal bugfix in cset 1.1431. --- arch/sparc/kernel/signal.c | 9 +++++++-- arch/sparc64/kernel/signal.c | 9 +++++++-- arch/sparc64/kernel/signal32.c | 9 +++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c index 97dfa4f464c0e..74fe483af5b79 100644 --- a/arch/sparc/kernel/signal.c +++ b/arch/sparc/kernel/signal.c @@ -1035,8 +1035,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, { switch(regs->u_regs[UREG_I0]) { case ERESTART_RESTARTBLOCK: - current_thread_info()->restart_block.fn = do_no_restart_syscall; - /* fallthrough */ case ERESTARTNOHAND: no_system_call_restart: regs->u_regs[UREG_I0] = EINTR; @@ -1086,6 +1084,13 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs, struct k_sigaction *ka; ka = ¤t->sighand->action[signr-1]; + + /* Always make any pending restarted system + * calls return -EINTR. + */ + current_thread_info()->restart_block.fn = + do_no_restart_syscall; + if (cookie.restart_syscall) syscall_restart(cookie.orig_i0, regs, &ka->sa); handle_signal(signr, ka, &info, oldset, regs, svr4_signal); diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 8c1acc4811042..5a4142d9b888f 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c @@ -579,8 +579,6 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, { switch (regs->u_regs[UREG_I0]) { case ERESTART_RESTARTBLOCK: - current_thread_info()->restart_block.fn = do_no_restart_syscall; - /* fallthrough */ case ERESTARTNOHAND: no_system_call_restart: regs->u_regs[UREG_I0] = EINTR; @@ -628,6 +626,13 @@ static int do_signal(sigset_t *oldset, struct pt_regs * regs, struct k_sigaction *ka; ka = ¤t->sighand->action[signr-1]; + + /* Always make any pending restarted system + * calls return -EINTR. + */ + current_thread_info()->restart_block.fn = + do_no_restart_syscall; + if (cookie.restart_syscall) syscall_restart(orig_i0, regs, &ka->sa); handle_signal(signr, ka, &info, oldset, regs); diff --git a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c index 9d1099fd95912..b0cac6c0fad33 100644 --- a/arch/sparc64/kernel/signal32.c +++ b/arch/sparc64/kernel/signal32.c @@ -1221,8 +1221,6 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs { switch (regs->u_regs[UREG_I0]) { case ERESTART_RESTARTBLOCK: - current_thread_info()->restart_block.fn = do_no_restart_syscall; - /* fallthrough */ case ERESTARTNOHAND: no_system_call_restart: regs->u_regs[UREG_I0] = EINTR; @@ -1259,6 +1257,13 @@ int do_signal32(sigset_t *oldset, struct pt_regs * regs, struct k_sigaction *ka; ka = ¤t->sighand->action[signr-1]; + + /* Always make any pending restarted system + * calls return -EINTR. + */ + current_thread_info()->restart_block.fn = + do_no_restart_syscall; + if (cookie.restart_syscall) syscall_restart32(orig_i0, regs, &ka->sa); handle_signal32(signr, ka, &info, oldset, regs, svr4_signal); -- 2.53.0