Messages in this thread | | | From | Linus Torvalds <> | Date | Sun, 20 Jan 2013 12:21:14 -0800 | Subject | Re: [PATCH 2/4] ptrace: ensure arch_ptrace/ptrace_request can never race with SIGKILL |
| |
On Sun, Jan 20, 2013 at 11:25 AM, Oleg Nesterov <oleg@redhat.com> wrote: > + > +static void ptrace_unfreeze_traced(struct task_struct *task) > +{ > + if (task->state != __TASK_TRACED) > + return; > + > + if (WARN_ON(!task->ptrace || task->parent != current)) > + return;
This WARN_ON() is bogus.
Because you added the warning, you then need to make the callers check for the whole PTRACE_UNATTACH.
So I think you should just remove the WARN_ON(), and then just call ptrace_unfreeze_traced() unconditionally after you've successfully done a ptrace_check_attach(). Just to keep the code simpler.
Also, in your corrected version, you had
+ if (!wait_task_inactive(child, __TASK_TRACED)) { + /* This can only happen if may_ptrace_stop() fails */ + WARN_ON(child->state == __TASK_TRACED); + ret = -ESRCH;
where I actually think that the comment is not really helpful. It doesn't really explain what he child can do to get to ptrace_stop() in the first place, and what that does to the child state...
Linus
| |