[PATCH] PPC64: Fix possible race in syscall restart

From: Paul Mackerras
Date: Tue Nov 18 2003 - 05:56:31 EST


Linus, please apply.

This is the PPC64 counterpart of the fix for the potential race in the
syscall restart code that has gone into other architectures. It resets
current_thread_info()->restart_block.fn to do_no_syscall_restart in
the sigreturn code.

Thanks,
Paul.

diff -urN ppc64-linux-2.5/arch/ppc64/kernel/signal.c ppc64-2.5/arch/ppc64/kernel/signal.c
--- ppc64-linux-2.5/arch/ppc64/kernel/signal.c 2003-10-22 21:59:05.000000000 +1000
+++ ppc64-2.5/arch/ppc64/kernel/signal.c 2003-11-17 08:52:15.000000000 +1100
@@ -220,6 +220,9 @@
sigset_t set;
stack_t st;

+ /* Always make any pending restarted system calls return -EINTR */
+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
if (verify_area(VERIFY_READ, uc, sizeof(*uc)))
goto badframe;

@@ -354,8 +357,6 @@
{
switch ((int)regs->result) {
case -ERESTART_RESTARTBLOCK:
- current_thread_info()->restart_block.fn = do_no_restart_syscall;
- /* fallthrough */
case -ERESTARTNOHAND:
/* ERESTARTNOHAND means that the syscall should only be
* restarted if there was no handler for the signal, and since
diff -urN ppc64-linux-2.5/arch/ppc64/kernel/signal32.c ppc64-2.5/arch/ppc64/kernel/signal32.c
--- ppc64-linux-2.5/arch/ppc64/kernel/signal32.c 2003-10-22 21:59:05.000000000 +1000
+++ ppc64-2.5/arch/ppc64/kernel/signal32.c 2003-11-17 08:54:29.000000000 +1100
@@ -300,6 +300,9 @@
struct sigcontext32 *sc = (struct sigcontext32 *)(u64)newsp;
int i;

+ /* Always make any pending restarted system calls return -EINTR */
+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
goto badframe;
if (regs->msr & MSR_FP)
@@ -420,6 +423,9 @@
int i;
mm_segment_t old_fs;

+ /* Always make any pending restarted system calls return -EINTR */
+ current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
/* Adjust the inputted reg1 to point to the first rt signal frame */
rt_sf = (struct rt_sigframe_32 *)(regs->gpr[1] + __SIGNAL_FRAMESIZE32);
/* Copy the information from the user stack */
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/