X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=kernel%2Fptrace.c;h=a73ebd3b9d4ca5019522fcf80c47eac8d5d7fa0c;hb=4e6045f134784f4b158b3c0f7a282b04bd816887;hp=82a558b655dabb9dc7990aedc804b9b04d8f1525;hpb=dcb76f88683618ed6ef0df66643dba1285881ee5;p=powerpc.git diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 82a558b655..a73ebd3b9d 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -233,6 +233,7 @@ int ptrace_detach(struct task_struct *child, unsigned int data) /* Architecture-specific hardware disable .. */ ptrace_disable(child); + clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); write_lock_irq(&tasklist_lock); /* protect against de_thread()->release_task() */ @@ -385,6 +386,9 @@ int ptrace_request(struct task_struct *child, long request, case PTRACE_SETSIGINFO: ret = ptrace_setsiginfo(child, (siginfo_t __user *) data); break; + case PTRACE_DETACH: /* detach a process that was attached. */ + ret = ptrace_detach(child, data); + break; default: break; } @@ -449,6 +453,10 @@ struct task_struct *ptrace_get_task_struct(pid_t pid) return child; } +#ifndef arch_ptrace_attach +#define arch_ptrace_attach(child) do { } while (0) +#endif + #ifndef __ARCH_SYS_PTRACE asmlinkage long sys_ptrace(long request, long pid, long addr, long data) { @@ -472,6 +480,12 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data) if (request == PTRACE_ATTACH) { ret = ptrace_attach(child); + /* + * Some architectures need to do book-keeping after + * a ptrace attach. + */ + if (!ret) + arch_ptrace_attach(child); goto out_put_task_struct; }