Messages in this thread Patch in this message | | | Date | Tue, 18 Nov 2003 21:53:10 +1100 | From | Paul Mackerras <> | Subject | [PATCH] PPC64: Fix possible race in syscall restart |
| |
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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |