diff options
author | Will Deacon <will.deacon@arm.com> | 2014-06-27 17:01:47 +0100 |
---|---|---|
committer | Kees Cook <keescook@google.com> | 2016-04-08 12:32:18 -0700 |
commit | e4d5474a5b587eebf9596b83d36bf8e282754d2b (patch) | |
tree | a1e4c3e82f59b0e83666727c88b9241d2a8191ee | |
parent | 260476d5fe31b0dcb6659dc908ae2c8da49929c9 (diff) | |
download | qcom-msm-v3.10-e4d5474a5b587eebf9596b83d36bf8e282754d2b.tar.gz |
BACKPORT: ARM: 8087/1: ptrace: reload syscall number after secure_computing() check
On the syscall tracing path, we call out to secure_computing() to allow
seccomp to check the syscall number being attempted. As part of this, a
SIGTRAP may be sent to the tracer and the syscall could be re-written by
a subsequent SET_SYSCALL ptrace request. Unfortunately, this new syscall
is ignored by the current code unless TIF_SYSCALL_TRACE is also set on
the current thread.
This patch slightly reworks the enter path of the syscall tracing code
so that we always reload the syscall number from
current_thread_info()->syscall after the potential ptrace traps.
Acked-by: Kees Cook <keescook@chromium.org>
Tested-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Bug: 28020023
Patchset: seccomp
(cherry picked from kernel/msm commit 553f58ae6466757db2a9ea2d51100d481df211e2)
Signed-off-by: Kees Cook <keescook@google.com>
Change-Id: I024d3ae40587db43028b2a20176baf22f1e0347e
-rw-r--r-- | arch/arm/kernel/ptrace.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 2bc1514d6db..6954df51b64 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -916,7 +916,7 @@ enum ptrace_syscall_dir { PTRACE_SYSCALL_EXIT, }; -static int tracehook_report_syscall(struct pt_regs *regs, +static void tracehook_report_syscall(struct pt_regs *regs, enum ptrace_syscall_dir dir) { unsigned long ip; @@ -934,7 +934,6 @@ static int tracehook_report_syscall(struct pt_regs *regs, current_thread_info()->syscall = -1; regs->ARM_ip = ip; - return current_thread_info()->syscall; } asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) @@ -946,7 +945,9 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno) return -1; if (test_thread_flag(TIF_SYSCALL_TRACE)) - scno = tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); + tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER); + + scno = current_thread_info()->syscall; if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) trace_sys_enter(regs, scno); |