lkml.org 
[lkml]   [2007]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -mm 08/43] compat_ptrace_request
    Date
    This adds a compat_ptrace_request that is the analogue of ptrace_request
    for the things that 32-on-64 ptrace implementations can share in common.
    So far there are just a couple of requests handled generically.

    Signed-off-by: Roland McGrath <roland@redhat.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    include/linux/compat.h | 4 ++++
    kernel/ptrace.c | 38 ++++++++++++++++++++++++++++++++++++++
    2 files changed, 42 insertions(+), 0 deletions(-)

    diff --git a/include/linux/compat.h b/include/linux/compat.h
    index ba29d4c..e70a2a1 100644
    --- a/include/linux/compat.h
    +++ b/include/linux/compat.h
    @@ -271,5 +271,9 @@ asmlinkage long compat_sys_signalfd(int ufd,
    asmlinkage long compat_sys_timerfd(int ufd, int clockid, int flags,
    const struct compat_itimerspec __user *utmr);

    +extern int compat_ptrace_request(struct task_struct *child,
    + compat_long_t request,
    + compat_ulong_t addr, compat_ulong_t data);
    +
    #endif /* CONFIG_COMPAT */
    #endif /* _LINUX_COMPAT_H */
    diff --git a/kernel/ptrace.c b/kernel/ptrace.c
    index e521042..bc1a764 100644
    --- a/kernel/ptrace.c
    +++ b/kernel/ptrace.c
    @@ -605,3 +605,41 @@ int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
    copied = access_process_vm(tsk, addr, &data, sizeof(data), 1);
    return (copied == sizeof(data)) ? 0 : -EIO;
    }
    +
    +#ifdef CONFIG_COMPAT
    +#include <linux/compat.h>
    +
    +int compat_ptrace_request(struct task_struct *child, compat_long_t request,
    + compat_ulong_t addr, compat_ulong_t data)
    +{
    + compat_ulong_t __user *datap = compat_ptr(data);
    + compat_ulong_t word;
    + int ret;
    +
    + switch (request) {
    + case PTRACE_PEEKTEXT:
    + case PTRACE_PEEKDATA:
    + ret = access_process_vm(child, addr, &word, sizeof(word), 0);
    + if (ret != sizeof(word))
    + ret = -EIO;
    + else
    + ret = put_user(word, datap);
    + break;
    +
    + case PTRACE_POKETEXT:
    + case PTRACE_POKEDATA:
    + ret = access_process_vm(child, addr, &data, sizeof(data), 1);
    + ret = (ret != sizeof(data) ? -EIO : 0);
    + break;
    +
    + case PTRACE_GETEVENTMSG:
    + ret = put_user((compat_ulong_t) child->ptrace_message, datap);
    + break;
    +
    + default:
    + ret = ptrace_request(child, request, addr, data);
    + }
    +
    + return ret;
    +}
    +#endif /* CONFIG_COMPAT */
    --
    1.5.3.6


    \
     
     \ /
      Last update: 2007-12-20 12:59    [W:0.024 / U:0.448 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site