Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
+19 −5
Original line number Original line Diff line number Diff line
@@ -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)
		 */
		 */
		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.. */