Add ARM patch that was missed when adding the last batch of fixes
svn path=/dists/sid/linux/; revision=20769
This commit is contained in:
parent
2967bec3f8
commit
28fda5d8fa
|
@ -0,0 +1,53 @@
|
||||||
|
From 3c1532df5c1b54b5f6246cdef94eeb73a39fe43a Mon Sep 17 00:00:00 2001
|
||||||
|
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
|
||||||
|
Date: Wed, 9 Oct 2013 15:58:29 +0100
|
||||||
|
Subject: ARM: 7851/1: check for number of arguments in syscall_get/set_arguments()
|
||||||
|
|
||||||
|
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
|
||||||
|
|
||||||
|
commit 3c1532df5c1b54b5f6246cdef94eeb73a39fe43a upstream.
|
||||||
|
|
||||||
|
In ftrace_syscall_enter(),
|
||||||
|
syscall_get_arguments(..., 0, n, ...)
|
||||||
|
if (i == 0) { <handle ORIG_r0> ...; n--;}
|
||||||
|
memcpy(..., n * sizeof(args[0]));
|
||||||
|
If 'number of arguments(n)' is zero and 'argument index(i)' is also zero in
|
||||||
|
syscall_get_arguments(), none of arguments should be copied by memcpy().
|
||||||
|
Otherwise 'n--' can be a big positive number and unexpected amount of data
|
||||||
|
will be copied. Tracing system calls which take no argument, say sync(void),
|
||||||
|
may hit this case and eventually make the system corrupted.
|
||||||
|
This patch fixes the issue both in syscall_get_arguments() and
|
||||||
|
syscall_set_arguments().
|
||||||
|
|
||||||
|
Acked-by: Will Deacon <will.deacon@arm.com>
|
||||||
|
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
|
||||||
|
Signed-off-by: Will Deacon <will.deacon@arm.com>
|
||||||
|
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
|
||||||
|
---
|
||||||
|
arch/arm/include/asm/syscall.h | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/arm/include/asm/syscall.h
|
||||||
|
+++ b/arch/arm/include/asm/syscall.h
|
||||||
|
@@ -57,6 +57,9 @@ static inline void syscall_get_arguments
|
||||||
|
unsigned int i, unsigned int n,
|
||||||
|
unsigned long *args)
|
||||||
|
{
|
||||||
|
+ if (n == 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (i + n > SYSCALL_MAX_ARGS) {
|
||||||
|
unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
|
||||||
|
unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
|
||||||
|
@@ -81,6 +84,9 @@ static inline void syscall_set_arguments
|
||||||
|
unsigned int i, unsigned int n,
|
||||||
|
const unsigned long *args)
|
||||||
|
{
|
||||||
|
+ if (n == 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (i + n > SYSCALL_MAX_ARGS) {
|
||||||
|
pr_warning("%s called with max args %d, handling only %d\n",
|
||||||
|
__func__, i + n, SYSCALL_MAX_ARGS);
|
Loading…
Reference in New Issue