aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ptrace.h2
-rw-r--r--include/uapi/linux/ptrace.h5
-rw-r--r--kernel/ptrace.c3
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 }