mirror of https://gitee.com/openkylin/linux.git
xtensa: fix uaccess-related livelock in do_page_fault
If a uaccess (e.g. get_user()) triggers a fault and there's a fault signal pending, the handler will return to the uaccess without having performed a uaccess fault fixup, and so the CPU will immediately execute the uaccess instruction again, whereupon it will livelock bouncing between that instruction and the fault handler. https://lore.kernel.org/lkml/20210121123140.GD48431@C02TD0UTHF1T.local/ Cc: stable@vger.kernel.org Reported-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
ab5eb33641
commit
7b9acbb6aa
|
@ -112,8 +112,11 @@ void do_page_fault(struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
fault = handle_mm_fault(vma, address, flags, regs);
|
fault = handle_mm_fault(vma, address, flags, regs);
|
||||||
|
|
||||||
if (fault_signal_pending(fault, regs))
|
if (fault_signal_pending(fault, regs)) {
|
||||||
|
if (!user_mode(regs))
|
||||||
|
goto bad_page_fault;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||||
if (fault & VM_FAULT_OOM)
|
if (fault & VM_FAULT_OOM)
|
||||||
|
|
Loading…
Reference in New Issue