[ARM] 3030/2: fix permission check in the obscur cmpxchg syscall
authorNicolas Pitre <nico@cam.org>
Sat, 25 Mar 2006 22:44:05 +0000 (22:44 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 25 Mar 2006 22:44:05 +0000 (22:44 +0000)
Patch from Nicolas Pitre

Quoting RMK:

|pte_write() just says that the page _may_ be writable. It doesn't say
|that the MMU is programmed to allow writes. If pte_dirty() doesn't
|return true, that means that the page is _not_ writable from userspace.
|If you write to it from kernel mode (without using put_user) you'll
|bypass the MMU read-only protection and may end up writing to a page
|owned by two separate processes.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/traps.c

index 03924bcc61293169c70bd65f48325a6a849c2514..d566d5f4574d051e5feb3d1ed2f62f72bf604b59 100644 (file)
@@ -506,7 +506,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
                if (!pmd_present(*pmd))
                        goto bad_access;
                pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
-               if (!pte_present(*pte) || !pte_write(*pte)) {
+               if (!pte_present(*pte) || !pte_dirty(*pte)) {
                        pte_unmap_unlock(pte, ptl);
                        goto bad_access;
                }