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: Tejun Heo <tj@kernel.org> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
This commit is contained in:
parent
a8f072c1d6
commit
755e276b33
2 changed files with 20 additions and 6 deletions
|
@ -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_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len);
|
||||
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,
|
||||
unsigned long addr, unsigned long data);
|
||||
extern void ptrace_notify(int exit_code);
|
||||
|
|
|
@ -97,10 +97,24 @@ void __ptrace_unlink(struct task_struct *child)
|
|||
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;
|
||||
|
||||
|
@ -119,13 +133,13 @@ int ptrace_check_attach(struct task_struct *child, int kill)
|
|||
*/
|
||||
spin_lock_irq(&child->sighand->siglock);
|
||||
WARN_ON_ONCE(task_is_stopped(child));
|
||||
if (task_is_traced(child) || kill)
|
||||
if (task_is_traced(child) || ignore_state)
|
||||
ret = 0;
|
||||
spin_unlock_irq(&child->sighand->siglock);
|
||||
}
|
||||
read_unlock(&tasklist_lock);
|
||||
|
||||
if (!ret && !kill)
|
||||
if (!ret && !ignore_state)
|
||||
ret = wait_task_inactive(child, TASK_TRACED) ? 0 : -ESRCH;
|
||||
|
||||
/* All systems go.. */
|
||||
|
|
Loading…
Reference in a new issue