From: Bodo Stroesser The patch syscall-security-3 is wrong (provided by me, sorry). I missed, that singlestepping_skas() used to reset PT_DTRACE. This was handled differently in tt and skas. With syscall-security-3 applied, a process in SKAS that singlestepped once continues to singlestep until the next systemcall occurs, even if it is resumed with PTRACE_CONT or PTRACE_SYSCALL. This fix unifies the usage of PT_DTRACE in TT and SKAS. PT_DTRACE now is set by ptrace(PTRACE_SINGLESTEP,...) and reset by singlestepping() and it is evaluated in kern_do_signal(). Signed-off-by: Bodo Stroesser --- --- linux-2.6.9-rc2/arch/um/kernel/process_kern.c 2004-10-01 18:42:27.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/process_kern.c 2004-10-05 21:09:48.303849436 +0200 @@ -405,9 +405,15 @@ { struct task_struct *task = t ? t : current; + if ( ! (task->ptrace & PT_DTRACE) ) + return(0); + + task->ptrace &= ~PT_DTRACE; + if (task->thread.singlestep_syscall) return(0); - return(task->ptrace & PT_DTRACE); + + return 1; } /* --- linux-2.6.9-rc2/arch/um/kernel/skas/syscall_kern.c 2004-10-01 18:28:35.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/skas/syscall_kern.c 2004-10-05 21:11:04.609239526 +0200 @@ -30,7 +30,6 @@ if(current->thread.singlestep_syscall){ current->thread.singlestep_syscall = 0; - current->ptrace &= ~PT_DTRACE; force_sig(SIGTRAP, current); } --- linux-2.6.9-rc2/arch/um/kernel/tt/syscall_kern.c 2004-10-01 18:01:35.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/tt/syscall_kern.c 2004-10-05 21:11:30.088029008 +0200 @@ -32,7 +32,6 @@ if(current->thread.singlestep_syscall){ current->thread.singlestep_syscall = 0; - current->ptrace &= ~PT_DTRACE; force_sig(SIGTRAP, current); } --- linux-2.6.9-rc2/arch/um/kernel/tt/process_kern.c 2004-10-01 18:36:17.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/tt/process_kern.c 2004-10-05 21:12:15.933452785 +0200 @@ -524,13 +524,6 @@ -err); } -void clear_singlestep(void *t) -{ - struct task_struct *task = t; - - task->ptrace &= ~PT_DTRACE; -} - int start_uml_tt(void) { void *sp; --- linux-2.6.9-rc2/arch/um/kernel/tt/tracer.c 2004-10-01 18:33:30.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/tt/tracer.c 2004-10-05 21:13:12.106169916 +0200 @@ -331,7 +331,6 @@ tracing = 0; if(do_syscall(task, pid)) sig = SIGUSR2; - else clear_singlestep(task); break; case SIGPROF: if(tracing) sig = 0; --- linux-2.6.9-rc2/arch/um/kernel/tt/include/tt.h 2004-10-01 18:34:01.000000000 +0200 +++ linux-2.6.9-rc2-orig/arch/um/kernel/tt/include/tt.h 2004-10-05 21:13:36.778092737 +0200 @@ -24,7 +24,6 @@ extern int set_user_mode(void *task); extern void set_tracing(void *t, int tracing); extern int is_tracing(void *task); -extern void clear_singlestep(void *t); extern void syscall_handler(int sig, union uml_pt_regs *regs); extern void exit_kernel(int pid, void *task); extern int do_syscall(void *task, int pid);