mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 06:55:13 +08:00
x86/fault: Fix SMAP #PF handling buglet for implicit supervisor accesses
Currently, if a user program somehow triggers an implicit supervisor access to a user address (e.g. if the kernel somehow sets LDTR to a user address), it will be incorrectly detected as a SMAP violation if AC is clear and SMAP is enabled. This is incorrect -- the error has nothing to do with SMAP. Fix the condition so that only accesses with the hardware USER bit set are diagnosed as SMAP violations. With the logic fixed, an implicit supervisor access to a user address will hit the code lower in the function that is intended to handle it even if SMAP is enabled. That logic is still a bit buggy, and later patches will clean it up. I *think* this code is still correct for WRUSS, and I've added a comment to that effect. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@surriel.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Yu-cheng Yu <yu-cheng.yu@intel.com> Link: http://lkml.kernel.org/r/d1d1b2e66ef31f884dba172084486ea9423ddcdb.1542667307.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
a15781b536
commit
e50928d721
@ -1235,12 +1235,15 @@ void do_user_addr_fault(struct pt_regs *regs,
|
||||
pgtable_bad(regs, hw_error_code, address);
|
||||
|
||||
/*
|
||||
* If SMAP is on, check for invalid kernel (supervisor)
|
||||
* access to user pages in the user address space.
|
||||
* If SMAP is on, check for invalid kernel (supervisor) access to user
|
||||
* pages in the user address space. The odd case here is WRUSS,
|
||||
* which, according to the preliminary documentation, does not respect
|
||||
* SMAP and will have the USER bit set so, in all cases, SMAP
|
||||
* enforcement appears to be consistent with the USER bit.
|
||||
*/
|
||||
if (unlikely(cpu_feature_enabled(X86_FEATURE_SMAP) &&
|
||||
!(hw_error_code & X86_PF_USER) &&
|
||||
(user_mode(regs) || !(regs->flags & X86_EFLAGS_AC))))
|
||||
!(regs->flags & X86_EFLAGS_AC)))
|
||||
{
|
||||
bad_area_nosemaphore(regs, hw_error_code, address);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user