X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fsparc%2Fkernel%2Fptrace.c;h=11cf8619dd8e9a5c86cccdac7fb31a9e79d395f6;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=80161abf820c1e1568194c06b6b57281cda73318;hpb=8e8ece46a861c84343256819eaec77e608ff9217;p=linux-2.6.git diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index 80161abf8..11cf8619d 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -74,7 +76,7 @@ static inline void read_sunos_user(struct pt_regs *regs, unsigned long offset, struct task_struct *tsk, long __user *addr) { struct pt_regs *cregs = tsk->thread.kregs; - struct thread_info *t = tsk->thread_info; + struct thread_info *t = task_thread_info(tsk); int v; if(offset >= 1024) @@ -169,7 +171,7 @@ static inline void write_sunos_user(struct pt_regs *regs, unsigned long offset, struct task_struct *tsk) { struct pt_regs *cregs = tsk->thread.kregs; - struct thread_info *t = tsk->thread_info; + struct thread_info *t = task_thread_info(tsk); unsigned long value = regs->u_regs[UREG_I3]; if(offset >= 1024) @@ -285,43 +287,23 @@ asmlinkage void do_ptrace(struct pt_regs *regs) s, (int) request, (int) pid, addr, data, addr2); } #endif - if(request == PTRACE_TRACEME) { - int ret; - /* are we already being traced? */ - if (current->ptrace & PT_PTRACED) { - pt_error_return(regs, EPERM); - goto out; - } - ret = security_ptrace(current->parent, current); - if (ret) { + if (request == PTRACE_TRACEME) { + ret = ptrace_traceme(); + if (ret < 0) pt_error_return(regs, -ret); - goto out; - } - - /* set the ptrace bit in the process flags. */ - current->ptrace |= PT_PTRACED; - pt_succ_return(regs, 0); - goto out; - } -#ifndef ALLOW_INIT_TRACING - if(pid == 1) { - /* Can't dork with init. */ - pt_error_return(regs, EPERM); + else + pt_succ_return(regs, 0); goto out; } -#endif - read_lock(&tasklist_lock); - child = find_task_by_pid(pid); - if (child) - get_task_struct(child); - read_unlock(&tasklist_lock); - if (!child) { - pt_error_return(regs, ESRCH); + child = ptrace_get_task_struct(pid); + if (IS_ERR(child)) { + ret = PTR_ERR(child); + pt_error_return(regs, -ret); goto out; } - if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) { + if (!vx_check(vx_task_xid(child), VS_WATCH_P|VS_IDENT)) { pt_error_return(regs, ESRCH); goto out_tsk; } @@ -378,8 +360,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) struct pt_regs *cregs = child->thread.kregs; int rval; - rval = verify_area(VERIFY_WRITE, pregs, sizeof(struct pt_regs)); - if(rval) { + if (!access_ok(VERIFY_WRITE, pregs, sizeof(struct pt_regs))) { + rval = -EFAULT; pt_error_return(regs, -rval); goto out_tsk; } @@ -405,9 +387,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) /* Must be careful, tracing process can only set certain * bits in the psr. */ - i = verify_area(VERIFY_READ, pregs, sizeof(struct pt_regs)); - if(i) { - pt_error_return(regs, -i); + if (!access_ok(VERIFY_READ, pregs, sizeof(struct pt_regs))) { + pt_error_return(regs, EFAULT); goto out_tsk; } __get_user(psr, (&pregs->psr)); @@ -417,7 +398,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs) psr &= PSR_ICC; cregs->psr &= ~PSR_ICC; cregs->psr |= psr; - if(!((pc | npc) & 3)) { + if (!((pc | npc) & 3)) { cregs->pc = pc; cregs->npc =npc; } @@ -443,8 +424,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) struct fps __user *fps = (struct fps __user *) addr; int i; - i = verify_area(VERIFY_WRITE, fps, sizeof(struct fps)); - if(i) { + if (!access_ok(VERIFY_WRITE, fps, sizeof(struct fps))) { + i = -EFAULT; pt_error_return(regs, -i); goto out_tsk; } @@ -478,8 +459,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) struct fps __user *fps = (struct fps __user *) addr; int i; - i = verify_area(VERIFY_READ, fps, sizeof(struct fps)); - if(i) { + if (!access_ok(VERIFY_READ, fps, sizeof(struct fps))) { + i = -EFAULT; pt_error_return(regs, -i); goto out_tsk; } @@ -531,7 +512,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs) addr = 1; case PTRACE_CONT: { /* restart after signal. */ - if (data > _NSIG) { + if (!valid_signal(data)) { pt_error_return(regs, EIO); goto out_tsk; }