ptrace: Always take siglock in ptrace_resume
Make code analysis simpler and future changes easier by always taking siglock in ptrace_resume. Tested-by: Kees Cook <keescook@chromium.org> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Link: https://lkml.kernel.org/r/20220505182645.497868-11-ebiederm@xmission.com Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
parent
2500ad1c7f
commit
5b4197cb28
|
@ -837,8 +837,6 @@ static long ptrace_get_rseq_configuration(struct task_struct *task,
|
||||||
static int ptrace_resume(struct task_struct *child, long request,
|
static int ptrace_resume(struct task_struct *child, long request,
|
||||||
unsigned long data)
|
unsigned long data)
|
||||||
{
|
{
|
||||||
bool need_siglock;
|
|
||||||
|
|
||||||
if (!valid_signal(data))
|
if (!valid_signal(data))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
@ -874,18 +872,11 @@ static int ptrace_resume(struct task_struct *child, long request,
|
||||||
* Note that we need siglock even if ->exit_code == data and/or this
|
* Note that we need siglock even if ->exit_code == data and/or this
|
||||||
* status was not reported yet, the new status must not be cleared by
|
* status was not reported yet, the new status must not be cleared by
|
||||||
* wait_task_stopped() after resume.
|
* wait_task_stopped() after resume.
|
||||||
*
|
|
||||||
* If data == 0 we do not care if wait_task_stopped() reports the old
|
|
||||||
* status and clears the code too; this can't race with the tracee, it
|
|
||||||
* takes siglock after resume.
|
|
||||||
*/
|
*/
|
||||||
need_siglock = data && !thread_group_empty(current);
|
spin_lock_irq(&child->sighand->siglock);
|
||||||
if (need_siglock)
|
|
||||||
spin_lock_irq(&child->sighand->siglock);
|
|
||||||
child->exit_code = data;
|
child->exit_code = data;
|
||||||
wake_up_state(child, __TASK_TRACED);
|
wake_up_state(child, __TASK_TRACED);
|
||||||
if (need_siglock)
|
spin_unlock_irq(&child->sighand->siglock);
|
||||||
spin_unlock_irq(&child->sighand->siglock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue