diff options
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r-- | kernel/ptrace.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1f5e55dda955..1599157336a6 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -215,8 +215,12 @@ ok: | |||
215 | smp_rmb(); | 215 | smp_rmb(); |
216 | if (task->mm) | 216 | if (task->mm) |
217 | dumpable = get_dumpable(task->mm); | 217 | dumpable = get_dumpable(task->mm); |
218 | if (!dumpable && !ptrace_has_cap(task_user_ns(task), mode)) | 218 | rcu_read_lock(); |
219 | if (!dumpable && !ptrace_has_cap(__task_cred(task)->user_ns, mode)) { | ||
220 | rcu_read_unlock(); | ||
219 | return -EPERM; | 221 | return -EPERM; |
222 | } | ||
223 | rcu_read_unlock(); | ||
220 | 224 | ||
221 | return security_ptrace_access_check(task, mode); | 225 | return security_ptrace_access_check(task, mode); |
222 | } | 226 | } |
@@ -280,8 +284,10 @@ static int ptrace_attach(struct task_struct *task, long request, | |||
280 | 284 | ||
281 | if (seize) | 285 | if (seize) |
282 | flags |= PT_SEIZED; | 286 | flags |= PT_SEIZED; |
283 | if (ns_capable(task_user_ns(task), CAP_SYS_PTRACE)) | 287 | rcu_read_lock(); |
288 | if (ns_capable(__task_cred(task)->user_ns, CAP_SYS_PTRACE)) | ||
284 | flags |= PT_PTRACE_CAP; | 289 | flags |= PT_PTRACE_CAP; |
290 | rcu_read_unlock(); | ||
285 | task->ptrace = flags; | 291 | task->ptrace = flags; |
286 | 292 | ||
287 | __ptrace_link(task, current); | 293 | __ptrace_link(task, current); |
@@ -457,6 +463,9 @@ void exit_ptrace(struct task_struct *tracer) | |||
457 | return; | 463 | return; |
458 | 464 | ||
459 | list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) { | 465 | list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) { |
466 | if (unlikely(p->ptrace & PT_EXITKILL)) | ||
467 | send_sig_info(SIGKILL, SEND_SIG_FORCED, p); | ||
468 | |||
460 | if (__ptrace_detach(tracer, p)) | 469 | if (__ptrace_detach(tracer, p)) |
461 | list_add(&p->ptrace_entry, &ptrace_dead); | 470 | list_add(&p->ptrace_entry, &ptrace_dead); |
462 | } | 471 | } |