patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / arch / i386 / kernel / ptrace.c
index 9f9b32a..6f3a626 100644 (file)
@@ -174,7 +174,7 @@ ptrace_get_thread_area(struct task_struct *child,
        ((desc)->a & 0x0ffff) | \
         ((desc)->b & 0xf0000) )
 
-#define GET_32BIT(desc)                (((desc)->b >> 23) & 1)
+#define GET_32BIT(desc)                (((desc)->b >> 22) & 1)
 #define GET_CONTENTS(desc)     (((desc)->b >> 10) & 3)
 #define GET_WRITABLE(desc)     (((desc)->b >>  9) & 1)
 #define GET_LIMIT_PAGES(desc)  (((desc)->b >> 23) & 1)
@@ -235,6 +235,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        struct task_struct *child;
        struct user * dummy = NULL;
        int i, ret;
+       unsigned long __user *datap = (unsigned long __user *)data;
 
        lock_kernel();
        ret = -EPERM;
@@ -258,6 +259,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        read_unlock(&tasklist_lock);
        if (!child)
                goto out;
+       if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT))
+               goto out_tsk;
 
        ret = -EPERM;
        if (pid == 1)           /* you may not mess with init */
@@ -283,7 +286,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
                ret = -EIO;
                if (copied != sizeof(tmp))
                        break;
-               ret = put_user(tmp,(unsigned long *) data);
+               ret = put_user(tmp, datap);
                break;
        }
 
@@ -305,7 +308,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
                        addr = addr >> 2;
                        tmp = child->thread.debugreg[addr];
                }
-               ret = put_user(tmp,(unsigned long *) data);
+               ret = put_user(tmp, datap);
                break;
        }
 
@@ -423,13 +426,13 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
                break;
 
        case PTRACE_GETREGS: { /* Get all gp regs from the child. */
-               if (!access_ok(VERIFY_WRITE, (unsigned *)data, FRAME_SIZE*sizeof(long))) {
+               if (!access_ok(VERIFY_WRITE, datap, FRAME_SIZE*sizeof(long))) {
                        ret = -EIO;
                        break;
                }
                for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) {
-                       __put_user(getreg(child, i),(unsigned long *) data);
-                       data += sizeof(long);
+                       __put_user(getreg(child, i), datap);
+                       datap++;
                }
                ret = 0;
                break;
@@ -437,21 +440,21 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
 
        case PTRACE_SETREGS: { /* Set all gp regs in the child. */
                unsigned long tmp;
-               if (!access_ok(VERIFY_READ, (unsigned *)data, FRAME_SIZE*sizeof(long))) {
+               if (!access_ok(VERIFY_READ, datap, FRAME_SIZE*sizeof(long))) {
                        ret = -EIO;
                        break;
                }
                for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) {
-                       __get_user(tmp, (unsigned long *) data);
+                       __get_user(tmp, datap);
                        putreg(child, i, tmp);
-                       data += sizeof(long);
+                       datap++;
                }
                ret = 0;
                break;
        }
 
        case PTRACE_GETFPREGS: { /* Get the child FPU state. */
-               if (!access_ok(VERIFY_WRITE, (unsigned *)data,
+               if (!access_ok(VERIFY_WRITE, datap,
                               sizeof(struct user_i387_struct))) {
                        ret = -EIO;
                        break;
@@ -464,7 +467,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        }
 
        case PTRACE_SETFPREGS: { /* Set the child FPU state. */
-               if (!access_ok(VERIFY_READ, (unsigned *)data,
+               if (!access_ok(VERIFY_READ, datap,
                               sizeof(struct user_i387_struct))) {
                        ret = -EIO;
                        break;
@@ -476,7 +479,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        }
 
        case PTRACE_GETFPXREGS: { /* Get the child extended FPU state. */
-               if (!access_ok(VERIFY_WRITE, (unsigned *)data,
+               if (!access_ok(VERIFY_WRITE, datap,
                               sizeof(struct user_fxsr_struct))) {
                        ret = -EIO;
                        break;
@@ -488,7 +491,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        }
 
        case PTRACE_SETFPXREGS: { /* Set the child extended FPU state. */
-               if (!access_ok(VERIFY_READ, (unsigned *)data,
+               if (!access_ok(VERIFY_READ, datap,
                               sizeof(struct user_fxsr_struct))) {
                        ret = -EIO;
                        break;
@@ -499,13 +502,13 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
        }
 
        case PTRACE_GET_THREAD_AREA:
-               ret = ptrace_get_thread_area(child,
-                                            addr, (struct user_desc __user *) data);
+               ret = ptrace_get_thread_area(child, addr,
+                                       (struct user_desc __user *) data);
                break;
 
        case PTRACE_SET_THREAD_AREA:
-               ret = ptrace_set_thread_area(child,
-                                            addr, (struct user_desc __user *) data);
+               ret = ptrace_set_thread_area(child, addr,
+                                       (struct user_desc __user *) data);
                break;
 
        default: