lkml.org 
[lkml]   [2003]   [Nov]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
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/
\
 
 \ /
  Last update: 2005-03-22 13:58    [W:0.033 / U:0.044 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site