Commit 755e276b authored by Tejun Heo's avatar Tejun Heo Committed by Oleg Nesterov

ptrace: ptrace_check_attach(): rename @kill to @ignore_state and add comments

PTRACE_INTERRUPT is going to be added which should also skip
task_is_traced() check in ptrace_check_attach().  Rename @kill to
@ignore_state and make it bool.  Add function comment while at it.

This patch doesn't introduce any behavior difference.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
parent a8f072c1
...@@ -105,7 +105,7 @@ extern long arch_ptrace(struct task_struct *child, long request, ...@@ -105,7 +105,7 @@ extern long arch_ptrace(struct task_struct *child, long request,
extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);
extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len);
extern void ptrace_disable(struct task_struct *); extern void ptrace_disable(struct task_struct *);
extern int ptrace_check_attach(struct task_struct *task, int kill); extern int ptrace_check_attach(struct task_struct *task, bool ignore_state);
extern int ptrace_request(struct task_struct *child, long request, extern int ptrace_request(struct task_struct *child, long request,
unsigned long addr, unsigned long data); unsigned long addr, unsigned long data);
extern void ptrace_notify(int exit_code); extern void ptrace_notify(int exit_code);
......
...@@ -97,10 +97,24 @@ void __ptrace_unlink(struct task_struct *child) ...@@ -97,10 +97,24 @@ void __ptrace_unlink(struct task_struct *child)
spin_unlock(&child->sighand->siglock); spin_unlock(&child->sighand->siglock);
} }
/* /**
* Check that we have indeed attached to the thing.. * ptrace_check_attach - check whether ptracee is ready for ptrace operation
* @child: ptracee to check for
* @ignore_state: don't check whether @child is currently %TASK_TRACED
*
* Check whether @child is being ptraced by %current and ready for further
* ptrace operations. If @ignore_state is %false, @child also should be in
* %TASK_TRACED state and on return the child is guaranteed to be traced
* and not executing. If @ignore_state is %true, @child can be in any
* state.
*
* CONTEXT:
* Grabs and releases tasklist_lock and @child->sighand->siglock.
*
* RETURNS:
* 0 on success, -ESRCH if %child is not ready.
*/ */
int ptrace_check_attach(struct task_struct *child, int kill) int ptrace_check_attach(struct task_struct *child, bool ignore_state)
{ {
int ret = -ESRCH; int ret = -ESRCH;
...@@ -119,13 +133,13 @@ int ptrace_check_attach(struct task_struct *child, int kill) ...@@ -119,13 +133,13 @@ int ptrace_check_attach(struct task_struct *child, int kill)
*/ */
spin_lock_irq(&child->sighand->siglock); spin_lock_irq(&child->sighand->siglock);
WARN_ON_ONCE(task_is_stopped(child)); WARN_ON_ONCE(task_is_stopped(child));
if (task_is_traced(child) || kill) if (task_is_traced(child) || ignore_state)
ret = 0; ret = 0;
spin_unlock_irq(&child->sighand->siglock); spin_unlock_irq(&child->sighand->siglock);
} }
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
if (!ret && !kill) if (!ret && !ignore_state)
ret = wait_task_inactive(child, TASK_TRACED) ? 0 : -ESRCH; ret = wait_task_inactive(child, TASK_TRACED) ? 0 : -ESRCH;
/* All systems go.. */ /* All systems go.. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment