X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=kernel%2Fptrace.c;h=a5caecef88be34c84b79d7e18cd2c3778416dc2f;hb=11262d0f0a11c1f781bf4958c1e5215f98c0743a;hp=49ba7c1ade9d074b814105fb648f33b0ce95f061;hpb=2ed5e5af2f9d5fb583ac1d36ba819f787bafbda6;p=mirror_ubuntu-zesty-kernel.git diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 49ba7c1ade9d..a5caecef88be 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -181,11 +181,17 @@ static void ptrace_unfreeze_traced(struct task_struct *task) WARN_ON(!task->ptrace || task->parent != current); + /* + * PTRACE_LISTEN can allow ptrace_trap_notify to wake us up remotely. + * Recheck state under the lock to close this race. + */ spin_lock_irq(&task->sighand->siglock); - if (__fatal_signal_pending(task)) - wake_up_state(task, __TASK_TRACED); - else - task->state = TASK_TRACED; + if (task->state == __TASK_TRACED) { + if (__fatal_signal_pending(task)) + wake_up_state(task, __TASK_TRACED); + else + task->state = TASK_TRACED; + } spin_unlock_irq(&task->sighand->siglock); }