ptrace: PTRACE_LISTEN forgets to unlock ->siglock
Oleg Nesterov
maintainerPATCH 1/1 ptrace: PTRACE_LISTEN forgets to unlock ->siglock
If PTRACE_LISTEN fails after lock_task_sighand() it doesn't drop ->siglock.
Reported-by Matt Fleming <[email protected]>
Signed-off-by Oleg Nesterov <[email protected]>
---
kernel/ptrace.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
kernel/ptrace.c renamed from kernel/ptrace.c~1_PTRACE_LISTEN_siglock +10 -13
@@ -744,20 +744,17 @@ int ptrace_request(struct task_struct *cbreak ; si = child->last_siginfo; -if (unlikely (!si || si->si_code >>8 !=PTRACE_EVENT_STOP )) -break ; - - child->jobctl |=JOBCTL_LISTENING ; - -/* -* If NOTIFY is set, it means event happened between start -* of this trap and now. Trigger re-trap immediately. -*/ -if (child->jobctl &JOBCTL_TRAP_NOTIFY ) -signal_wake_up (child, true); - +if (likely (si && (si->si_code >>8 ) ==PTRACE_EVENT_STOP )) { + child->jobctl |=JOBCTL_LISTENING ; +/* +* If NOTIFY is set, it means event happened between +* start of this trap and now. Trigger re-trap. +*/ +if (child->jobctl &JOBCTL_TRAP_NOTIFY ) +signal_wake_up (child, true); + ret =0 ; + }unlock_task_sighand (child, &flags); - ret =0 ;break ;case PTRACE_DETACH :/* detach a process that was attached. */
Quoted 33 lines · Oleg Nesterov
If
PTRACE_LISTENfails afterlock_task_sighand()it doesn't drop ->siglock.Reported-by Matt Fleming <[email protected]>Signed-off-by Oleg Nesterov <[email protected]>---
kernel/ptrace.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)kernel/ptrace.c renamed from kernel/ptrace.c~1_PTRACE_LISTEN_siglock +5
-12@@ -744,20 +744,17 @@ int ptrace_request(struct task_struct *cbreak ; si = child->last_siginfo; -if (unlikely (!si || si->si_code >>8 !=PTRACE_EVENT_STOP )) -break ; - - child->jobctl |=JOBCTL_LISTENING ; - -/* -* If NOTIFY is set, it means event happened between start -* of this trap and now. Trigger re-trap immediately. -*/ -if (child->jobctl &JOBCTL_TRAP_NOTIFY ) -signal_wake_up (child, true); - +if (likely (si && (si->si_code >>8 ) ==PTRACE_EVENT_STOP )) { + child->jobctl |=JOBCTL_LISTENING ; +/* +* If NOTIFY is set, it means event happened between +* start of this trap and now. Trigger re-trap.
kernel/ptrace.c int ptrace_request(struct task_struct *c · line 760
Quoted 10 lines
kernel/ptrace.c renamed from kernel/ptrace.c~1_PTRACE_LISTEN_siglock +5
-1+*/ +if (child->jobctl &JOBCTL_TRAP_NOTIFY ) +signal_wake_up (child, true); + ret =0 ; + }unlock_task_sighand (child, &flags); - ret =0 ;break ;case PTRACE_DETACH :/* detach a process that was attached. */
Thanks Oleg, looks good to me.
Signature · 1 line
Matt Fleming, Intel Open Source Technology Center