diff options
author | Andrew Pinski <apinski@cavium.com> | 2014-09-03 14:19:13 -0700 |
---|---|---|
committer | Andrey Konovalov <andrey.konovalov@linaro.org> | 2015-03-06 18:50:01 +0300 |
commit | 8d28bf552c2e0eba4a0c07bd62141bd8a4bdf296 (patch) | |
tree | 94645d4b927dc51982adb66d6264faa412c2c69e | |
parent | 534d491c08c7df01976e989b28e42aec9ff2b44a (diff) |
ptrace: Allow compat to use the native siginfo
With ARM64 ILP32 ABI, we want to use the non-compat
siginfo as we want to simplify signal handling for this new ABI.
This patch just adds a new define COMPAT_USE_NATIVE_SIGINFO and
if it is true then read/write in the compat case as it was the
non-compat case.
Signed-off-by: Andrew Pinski <apinski@cavium.com>
-rw-r--r-- | include/linux/compat.h | 4 | ||||
-rw-r--r-- | kernel/ptrace.c | 25 |
2 files changed, 22 insertions, 7 deletions
diff --git a/include/linux/compat.h b/include/linux/compat.h index ab25814690bc..d11c5567ff4a 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -24,6 +24,10 @@ #define COMPAT_USE_64BIT_TIME 0 #endif +#ifndef COMPAT_USE_NATIVE_SIGINFO +#define COMPAT_USE_NATIVE_SIGINFO 0 +#endif + #ifndef __SC_DELOUSE #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #endif diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 227fec36b12a..f7761802fc3a 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -640,7 +640,7 @@ static int ptrace_peek_siginfo(struct task_struct *child, break; #ifdef CONFIG_COMPAT - if (unlikely(is_compat_task())) { + if (unlikely(is_compat_task() && !COMPAT_USE_NATIVE_SIGINFO)) { compat_siginfo_t __user *uinfo = compat_ptr(data); if (copy_siginfo_to_user32(uinfo, &info) || @@ -1108,16 +1108,27 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request, case PTRACE_GETSIGINFO: ret = ptrace_getsiginfo(child, &siginfo); - if (!ret) - ret = copy_siginfo_to_user32( - (struct compat_siginfo __user *) datap, - &siginfo); + if (!ret) { + if (COMPAT_USE_NATIVE_SIGINFO) + ret = copy_siginfo_to_user( + (struct siginfo __user *) datap, + &siginfo); + else + ret = copy_siginfo_to_user32( + (struct compat_siginfo __user *) datap, + &siginfo); + } break; case PTRACE_SETSIGINFO: memset(&siginfo, 0, sizeof siginfo); - if (copy_siginfo_from_user32( - &siginfo, (struct compat_siginfo __user *) datap)) + if (COMPAT_USE_NATIVE_SIGINFO) + ret = copy_from_user(&siginfo, datap, sizeof(siginfo)); + else + ret = copy_siginfo_from_user32( + &siginfo, + (struct compat_siginfo __user *) datap); + if (ret) ret = -EFAULT; else ret = ptrace_setsiginfo(child, &siginfo); |