git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
arch
/
sparc
/
kernel
/
ptrace.c
diff --git
a/arch/sparc/kernel/ptrace.c
b/arch/sparc/kernel/ptrace.c
index
80161ab
..
11cf861
100644
(file)
--- a/
arch/sparc/kernel/ptrace.c
+++ b/
arch/sparc/kernel/ptrace.c
@@
-18,6
+18,8
@@
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/security.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/security.h>
+#include <linux/signal.h>
+#include <linux/vs_base.h>
#include <asm/pgtable.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/system.h>
@@
-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 task_struct *tsk, long __user *addr)
{
struct pt_regs *cregs = tsk->thread.kregs;
- struct thread_info *t = t
sk->thread_info
;
+ struct thread_info *t = t
ask_thread_info(tsk)
;
int v;
if(offset >= 1024)
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 task_struct *tsk)
{
struct pt_regs *cregs = tsk->thread.kregs;
- struct thread_info *t = t
sk->thread_info
;
+ struct thread_info *t = t
ask_thread_info(tsk)
;
unsigned long value = regs->u_regs[UREG_I3];
if(offset >= 1024)
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
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);
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;
}
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;
}
goto out;
}
- if (!vx_check(vx_task_xid(child), V
X_WATCH|VX
_IDENT)) {
+ if (!vx_check(vx_task_xid(child), V
S_WATCH_P|VS
_IDENT)) {
pt_error_return(regs, ESRCH);
goto out_tsk;
}
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;
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;
}
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.
*/
/* 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));
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;
psr &= PSR_ICC;
cregs->psr &= ~PSR_ICC;
cregs->psr |= psr;
- if(!((pc | npc) & 3)) {
+ if
(!((pc | npc) & 3)) {
cregs->pc = pc;
cregs->npc =npc;
}
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;
struct fps __user *fps = (struct fps __user *) addr;
int i;
- i
= verify_area(VERIFY_WRITE, fps, sizeof(struct fps));
- if(i) {
+ i
f (!access_ok(VERIFY_WRITE, fps, sizeof(struct fps))) {
+ i = -EFAULT;
pt_error_return(regs, -i);
goto out_tsk;
}
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;
struct fps __user *fps = (struct fps __user *) addr;
int i;
- i
= verify_area(VERIFY_READ, fps, sizeof(struct fps));
- if(i) {
+ i
f (!access_ok(VERIFY_READ, fps, sizeof(struct fps))) {
+ i = -EFAULT;
pt_error_return(regs, -i);
goto out_tsk;
}
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. */
addr = 1;
case PTRACE_CONT: { /* restart after signal. */
- if (
data > _NSIG
) {
+ if (
!valid_signal(data)
) {
pt_error_return(regs, EIO);
goto out_tsk;
}
pt_error_return(regs, EIO);
goto out_tsk;
}