diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index f0943d160ffeccc8d02ece3f82d023bc7c68970a..a5b33ff3924edc35c216f93232031f802651c4ad 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -171,7 +171,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, if (fsr & (1 << 11)) /* write? */ mask = VM_WRITE; else - mask = VM_READ|VM_EXEC; + mask = VM_READ|VM_EXEC|VM_WRITE; fault = VM_FAULT_BADACCESS; if (!(vma->vm_flags & mask)) diff --git a/arch/arm26/mm/fault.c b/arch/arm26/mm/fault.c index 761938b56679453d350adb663187b4d9b52399ac..a7c4cc922095a184f8dc95f85f7332f857f26b12 100644 --- a/arch/arm26/mm/fault.c +++ b/arch/arm26/mm/fault.c @@ -155,7 +155,7 @@ __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, */ good_area: if (READ_FAULT(fsr)) /* read? */ - mask = VM_READ|VM_EXEC; + mask = VM_READ|VM_EXEC|VM_WRITE; else mask = VM_WRITE; diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index 5e17a3f43b41ba89c15b17e7390f04dc730ada64..50d8617391dd09cfd86bde16882580c9cc8cebb1 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -440,7 +440,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs, case 1: /* read, present */ goto bad_area; case 0: /* read, not present */ - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto bad_area; } diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 14ef7cceb208bbd45031036cecadfda5e5527487..d8b1b4ac7f2609f5a4a1a5294d3721c53baae885 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c @@ -146,9 +146,11 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re # error File is out of sync with . Please update. # endif + if (((isr >> IA64_ISR_R_BIT) & 1UL) && (!(vma->vm_flags & (VM_READ | VM_WRITE)))) + goto bad_area; + mask = ( (((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT) - | (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT) - | (((isr >> IA64_ISR_R_BIT) & 1UL) << VM_READ_BIT)); + | (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT)); if ((vma->vm_flags & mask) != mask) goto bad_area; diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c index aec15270d334b74795fbfdf7ec214434f35a923f..5e2d87c10c872bbdf42d4dc6bcce1ccd7b72b579 100644 --- a/arch/m68k/mm/fault.c +++ b/arch/m68k/mm/fault.c @@ -144,7 +144,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, case 1: /* read, present */ goto acc_err; case 0: /* read, not present */ - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto acc_err; } diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index 78a0d59903ee69d2b8ac96de20e18c17fd5f9206..77953f41d75406c200085e0bca8151857df9742f 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -333,7 +333,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, /* protection fault */ if (error_code & 0x08000000) goto bad_area; - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto bad_area; } diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c index 5cdfb71fcb078ca50f56059a907e0104ab452194..bc776beb3136f28bced9d3a4ab08d4efc039e5f8 100644 --- a/arch/ppc/mm/fault.c +++ b/arch/ppc/mm/fault.c @@ -239,7 +239,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address, /* protection fault */ if (error_code & 0x08000000) goto bad_area; - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto bad_area; } diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c index c69fd603226aa80a20ba084aebd545e65c5142c3..507f28914706ba4c8e4768c06df5f79a5bc6f998 100644 --- a/arch/sh/mm/fault.c +++ b/arch/sh/mm/fault.c @@ -69,7 +69,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess, if (!(vma->vm_flags & VM_WRITE)) goto bad_area; } else { - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto bad_area; } diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c index 1a17b0733ab5d38ad81ccdf4263e2d58571d9e24..9ba54cc2b5f676e0cfe0ed4a6f6fee53daa7ddeb 100644 --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c @@ -464,7 +464,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, case PF_PROT: /* read, present */ goto bad_area; case 0: /* read, not present */ - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) goto bad_area; }