]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Fix x86-64 ptrace
authorAndrew Morton <akpm@osdl.org>
Tue, 20 Jan 2004 11:13:39 +0000 (03:13 -0800)
committerLinus Torvalds <torvalds@home.osdl.org>
Tue, 20 Jan 2004 11:13:39 +0000 (03:13 -0800)
From: Andi Kleen <ak@muc.de>

The EFLAGS checking was not correct.  This also fixes some problems with
32bit gdb who would sometimes make the kernel BUG.

arch/x86_64/ia32/ptrace32.c

index 6d9b8da52c9d05ddd10c58992c8311c1adcd0515..0457e49999adc7d100b848962eb9f83b31dbab99 100644 (file)
 #include <linux/ptrace.h>
 #include <linux/mm.h>
 
+/* determines which flags the user has access to. */
+/* 1 = access 0 = no access */
+#define FLAG_MASK 0x44dd5UL
+
 #define R32(l,q) \
        case offsetof(struct user32, regs.l): stack[offsetof(struct pt_regs, q)/8] = val; break
 
@@ -70,9 +74,12 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 val)
        R32(eip, rip);
        R32(esp, rsp);
 
-       case offsetof(struct user32, regs.eflags): 
-               stack[offsetof(struct pt_regs, eflags)/8] = val & 0x44dd5; 
+       case offsetof(struct user32, regs.eflags): {
+               __u64 *flags = &stack[offsetof(struct pt_regs, eflags)/8];
+               val &= FLAG_MASK;
+               *flags = val | (*flags & ~FLAG_MASK);
                break;
+       }
 
        case offsetof(struct user32, u_debugreg[4]): 
        case offsetof(struct user32, u_debugreg[5]):