X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fsparc%2Fkernel%2Fptrace.c;h=949072b1c6ca9218f399dc96a946041911ddb351;hb=4e4f43fe003969bdaa246374b90e16708a22ef79;hp=b1b6cdac7e671df4fb0031280cc2575bcda14153;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index b1b6cdac7..949072b1c 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c @@ -50,8 +50,10 @@ static inline void pt_succ_return(struct pt_regs *regs, unsigned long value) static void pt_succ_return_linux(struct pt_regs *regs, unsigned long value, long *addr) { - if(put_user(value, addr)) - return pt_error_return(regs, EFAULT); + if (put_user(value, (long __user *) addr)) { + pt_error_return(regs, EFAULT); + return; + } regs->u_regs[UREG_I0] = 0; regs->psr &= ~PSR_C; regs->pc = regs->npc; @@ -319,6 +321,10 @@ asmlinkage void do_ptrace(struct pt_regs *regs) pt_error_return(regs, ESRCH); goto out; } + if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT)) { + pt_error_return(regs, ESRCH); + goto out_tsk; + } if ((current->personality == PER_SUNOS && request == PTRACE_SUNATTACH) || (current->personality != PER_SUNOS && request == PTRACE_ATTACH)) { @@ -368,7 +374,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs) } case PTRACE_GETREGS: { - struct pt_regs *pregs = (struct pt_regs *) addr; + struct pt_regs __user *pregs = (struct pt_regs __user *) addr; struct pt_regs *cregs = child->thread.kregs; int rval; @@ -391,7 +397,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs) } case PTRACE_SETREGS: { - struct pt_regs *pregs = (struct pt_regs *) addr; + struct pt_regs __user *pregs = (struct pt_regs __user *) addr; struct pt_regs *cregs = child->thread.kregs; unsigned long psr, pc, npc, y; int i; @@ -433,7 +439,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) unsigned long *insnaddr; unsigned long insn; } fpq[16]; - } *fps = (struct fps *) addr; + }; + struct fps __user *fps = (struct fps __user *) addr; int i; i = verify_area(VERIFY_WRITE, fps, sizeof(struct fps)); @@ -467,7 +474,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) unsigned long *insnaddr; unsigned long insn; } fpq[16]; - } *fps = (struct fps *) addr; + }; + struct fps __user *fps = (struct fps __user *) addr; int i; i = verify_area(VERIFY_READ, fps, sizeof(struct fps)); @@ -489,7 +497,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) case PTRACE_READTEXT: case PTRACE_READDATA: { - int res = ptrace_readdata(child, addr, (void *) addr2, data); + int res = ptrace_readdata(child, addr, + (void __user *) addr2, data); if (res == data) { pt_succ_return(regs, 0); @@ -504,7 +513,8 @@ asmlinkage void do_ptrace(struct pt_regs *regs) case PTRACE_WRITETEXT: case PTRACE_WRITEDATA: { - int res = ptrace_writedata(child, (void *) addr2, addr, data); + int res = ptrace_writedata(child, (void __user *) addr2, + addr, data); if (res == data) { pt_succ_return(regs, 0);