| From 1b97937246d8b97c0760d16d8992c7937bdf5e6a Mon Sep 17 00:00:00 2001 |
| From: Russell King <rmk+kernel@arm.linux.org.uk> |
| Date: Fri, 15 May 2015 11:02:23 +0100 |
| Subject: ARM: fix missing syscall trace exit |
| |
| From: Russell King <rmk+kernel@arm.linux.org.uk> |
| |
| commit 1b97937246d8b97c0760d16d8992c7937bdf5e6a upstream. |
| |
| Josh Stone reports: |
| |
| I've discovered a case where both arm and arm64 will miss a ptrace |
| syscall-exit that they should report. If the syscall is entered |
| without TIF_SYSCALL_TRACE set, then it goes on the fast path. It's |
| then possible to have TIF_SYSCALL_TRACE added in the middle of the |
| syscall, but ret_fast_syscall doesn't check this flag again. |
| |
| Fix this by always checking for a syscall trace in the fast exit path. |
| |
| Reported-by: Josh Stone <jistone@redhat.com> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/kernel/entry-common.S | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/arch/arm/kernel/entry-common.S |
| +++ b/arch/arm/kernel/entry-common.S |
| @@ -32,7 +32,9 @@ ret_fast_syscall: |
| UNWIND(.fnstart ) |
| UNWIND(.cantunwind ) |
| disable_irq @ disable interrupts |
| - ldr r1, [tsk, #TI_FLAGS] |
| + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing |
| + tst r1, #_TIF_SYSCALL_WORK |
| + bne __sys_trace_return |
| tst r1, #_TIF_WORK_MASK |
| bne fast_work_pending |
| asm_trace_hardirqs_on |