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 | } |
