diff options
Diffstat (limited to 'arch/x86_64/kernel/ptrace.c')
-rw-r--r-- | arch/x86_64/kernel/ptrace.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c index c7011675007d..e26e86bb56fe 100644 --- a/arch/x86_64/kernel/ptrace.c +++ b/arch/x86_64/kernel/ptrace.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/security.h> | 18 | #include <linux/security.h> |
19 | #include <linux/audit.h> | 19 | #include <linux/audit.h> |
20 | #include <linux/seccomp.h> | 20 | #include <linux/seccomp.h> |
21 | #include <linux/signal.h> | ||
21 | 22 | ||
22 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
23 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
@@ -467,7 +468,7 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data | |||
467 | case PTRACE_CONT: /* restart after signal. */ | 468 | case PTRACE_CONT: /* restart after signal. */ |
468 | 469 | ||
469 | ret = -EIO; | 470 | ret = -EIO; |
470 | if ((unsigned long) data > _NSIG) | 471 | if (!valid_signal(data)) |
471 | break; | 472 | break; |
472 | if (request == PTRACE_SYSCALL) | 473 | if (request == PTRACE_SYSCALL) |
473 | set_tsk_thread_flag(child,TIF_SYSCALL_TRACE); | 474 | set_tsk_thread_flag(child,TIF_SYSCALL_TRACE); |
@@ -529,7 +530,7 @@ asmlinkage long sys_ptrace(long request, long pid, unsigned long addr, long data | |||
529 | 530 | ||
530 | case PTRACE_SINGLESTEP: /* set the trap flag. */ | 531 | case PTRACE_SINGLESTEP: /* set the trap flag. */ |
531 | ret = -EIO; | 532 | ret = -EIO; |
532 | if ((unsigned long) data > _NSIG) | 533 | if (!valid_signal(data)) |
533 | break; | 534 | break; |
534 | clear_tsk_thread_flag(child,TIF_SYSCALL_TRACE); | 535 | clear_tsk_thread_flag(child,TIF_SYSCALL_TRACE); |
535 | set_singlestep(child); | 536 | set_singlestep(child); |
@@ -634,20 +635,29 @@ asmlinkage void syscall_trace_enter(struct pt_regs *regs) | |||
634 | /* do the secure computing check first */ | 635 | /* do the secure computing check first */ |
635 | secure_computing(regs->orig_rax); | 636 | secure_computing(regs->orig_rax); |
636 | 637 | ||
637 | if (unlikely(current->audit_context)) | ||
638 | audit_syscall_entry(current, regs->orig_rax, | ||
639 | regs->rdi, regs->rsi, | ||
640 | regs->rdx, regs->r10); | ||
641 | |||
642 | if (test_thread_flag(TIF_SYSCALL_TRACE) | 638 | if (test_thread_flag(TIF_SYSCALL_TRACE) |
643 | && (current->ptrace & PT_PTRACED)) | 639 | && (current->ptrace & PT_PTRACED)) |
644 | syscall_trace(regs); | 640 | syscall_trace(regs); |
641 | |||
642 | if (unlikely(current->audit_context)) { | ||
643 | if (test_thread_flag(TIF_IA32)) { | ||
644 | audit_syscall_entry(current, AUDIT_ARCH_I386, | ||
645 | regs->orig_rax, | ||
646 | regs->rbx, regs->rcx, | ||
647 | regs->rdx, regs->rsi); | ||
648 | } else { | ||
649 | audit_syscall_entry(current, AUDIT_ARCH_X86_64, | ||
650 | regs->orig_rax, | ||
651 | regs->rdi, regs->rsi, | ||
652 | regs->rdx, regs->r10); | ||
653 | } | ||
654 | } | ||
645 | } | 655 | } |
646 | 656 | ||
647 | asmlinkage void syscall_trace_leave(struct pt_regs *regs) | 657 | asmlinkage void syscall_trace_leave(struct pt_regs *regs) |
648 | { | 658 | { |
649 | if (unlikely(current->audit_context)) | 659 | if (unlikely(current->audit_context)) |
650 | audit_syscall_exit(current, regs->rax); | 660 | audit_syscall_exit(current, AUDITSC_RESULT(regs->rax), regs->rax); |
651 | 661 | ||
652 | if ((test_thread_flag(TIF_SYSCALL_TRACE) | 662 | if ((test_thread_flag(TIF_SYSCALL_TRACE) |
653 | || test_thread_flag(TIF_SINGLESTEP)) | 663 | || test_thread_flag(TIF_SINGLESTEP)) |