Commit bcfc8f0d authored by Petar Jovanovic's avatar Petar Jovanovic Committed by Ralf Baechle

MIPS: traps: return correct si code for accessing nonmapped addresses

find_vma() returns the first VMA which satisfies fault_addr < vm_end, but
it does not guarantee fault_addr is actually within VMA. Therefore, kernel
has to check that before it chooses correct si code on return.
Signed-off-by: default avatarPetar Jovanovic <petar.jovanovic@rt-rk.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13808/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 008d0cf1
...@@ -704,6 +704,7 @@ asmlinkage void do_ov(struct pt_regs *regs) ...@@ -704,6 +704,7 @@ asmlinkage void do_ov(struct pt_regs *regs)
int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31) int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31)
{ {
struct siginfo si = { 0 }; struct siginfo si = { 0 };
struct vm_area_struct *vma;
switch (sig) { switch (sig) {
case 0: case 0:
...@@ -744,7 +745,8 @@ int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31) ...@@ -744,7 +745,8 @@ int process_fpemu_return(int sig, void __user *fault_addr, unsigned long fcr31)
si.si_addr = fault_addr; si.si_addr = fault_addr;
si.si_signo = sig; si.si_signo = sig;
down_read(&current->mm->mmap_sem); down_read(&current->mm->mmap_sem);
if (find_vma(current->mm, (unsigned long)fault_addr)) vma = find_vma(current->mm, (unsigned long)fault_addr);
if (vma && (vma->vm_start <= (unsigned long)fault_addr))
si.si_code = SEGV_ACCERR; si.si_code = SEGV_ACCERR;
else else
si.si_code = SEGV_MAPERR; si.si_code = SEGV_MAPERR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment