diff options
-rw-r--r-- | include/linux/ptrace.h | 2 | ||||
-rw-r--r-- | include/uapi/linux/ptrace.h | 5 | ||||
-rw-r--r-- | kernel/ptrace.c | 3 |
3 files changed, 9 insertions, 1 deletions
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index a89ff04bddd9..addfbe7c180e 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
@@ -32,6 +32,8 @@ | |||
32 | #define PT_TRACE_EXIT PT_EVENT_FLAG(PTRACE_EVENT_EXIT) | 32 | #define PT_TRACE_EXIT PT_EVENT_FLAG(PTRACE_EVENT_EXIT) |
33 | #define PT_TRACE_SECCOMP PT_EVENT_FLAG(PTRACE_EVENT_SECCOMP) | 33 | #define PT_TRACE_SECCOMP PT_EVENT_FLAG(PTRACE_EVENT_SECCOMP) |
34 | 34 | ||
35 | #define PT_EXITKILL (PTRACE_O_EXITKILL << PT_OPT_FLAG_SHIFT) | ||
36 | |||
35 | /* single stepping state bits (used on ARM and PA-RISC) */ | 37 | /* single stepping state bits (used on ARM and PA-RISC) */ |
36 | #define PT_SINGLESTEP_BIT 31 | 38 | #define PT_SINGLESTEP_BIT 31 |
37 | #define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT) | 39 | #define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT) |
diff --git a/include/uapi/linux/ptrace.h b/include/uapi/linux/ptrace.h index 1ef6c056a9e4..022ab186a812 100644 --- a/include/uapi/linux/ptrace.h +++ b/include/uapi/linux/ptrace.h | |||
@@ -73,7 +73,10 @@ | |||
73 | #define PTRACE_O_TRACEEXIT (1 << PTRACE_EVENT_EXIT) | 73 | #define PTRACE_O_TRACEEXIT (1 << PTRACE_EVENT_EXIT) |
74 | #define PTRACE_O_TRACESECCOMP (1 << PTRACE_EVENT_SECCOMP) | 74 | #define PTRACE_O_TRACESECCOMP (1 << PTRACE_EVENT_SECCOMP) |
75 | 75 | ||
76 | #define PTRACE_O_MASK 0x000000ff | 76 | /* eventless options */ |
77 | #define PTRACE_O_EXITKILL (1 << 20) | ||
78 | |||
79 | #define PTRACE_O_MASK (0x000000ff | PTRACE_O_EXITKILL) | ||
77 | 80 | ||
78 | #include <asm/ptrace.h> | 81 | #include <asm/ptrace.h> |
79 | 82 | ||
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 1f5e55dda955..ec8118ab2a47 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -457,6 +457,9 @@ void exit_ptrace(struct task_struct *tracer) | |||
457 | return; | 457 | return; |
458 | 458 | ||
459 | list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) { | 459 | list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) { |
460 | if (unlikely(p->ptrace & PT_EXITKILL)) | ||
461 | send_sig_info(SIGKILL, SEND_SIG_FORCED, p); | ||
462 | |||
460 | if (__ptrace_detach(tracer, p)) | 463 | if (__ptrace_detach(tracer, p)) |
461 | list_add(&p->ptrace_entry, &ptrace_dead); | 464 | list_add(&p->ptrace_entry, &ptrace_dead); |
462 | } | 465 | } |