arch/x86/mm/fault.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Commit 35f1c89b0cce ("x86/fault: Fix AMD erratum #91 errata fixup for user
code") uses accessors based on the access mode, i.e., it distinguishes its
access if instr carries a user address or a kernel address.
Since that commit, sparse complains about passing an argument without
__user annotation to get_user(), which expects a pointer with __user:
arch/x86/mm/fault.c:152:29: warning: incorrect type in argument 1 (different address spaces)
arch/x86/mm/fault.c:152:29: expected void const volatile [noderef] __user *ptr
arch/x86/mm/fault.c:152:29: got unsigned char *[assigned] instr
instr is a user-space pointer in this branch of prefetch(), though:
If user_mode, then instr is from user space. And if not user_mode, then
instr is from kernel space. So, in this user_mode branch, confidently
annotate instr with __user before passing it to get_user().
This annotation does no harm and just reminds everyone of the reasoning
above and convinces sparse that the address spaces are handled correctly
here.
There is no need for others to check the situation of different address
spaces on this specific branch due to this warning from sparse again.
No functional change. No change in the generated object code.
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
---
arch/x86/mm/fault.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index d0074c6ed31a..fad8faa29d04 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -149,7 +149,7 @@ is_prefetch(struct pt_regs *regs, unsigned long error_code, unsigned long addr)
unsigned char opcode;
if (user_mode(regs)) {
- if (get_user(opcode, instr))
+ if (get_user(opcode, (unsigned char __user *) instr))
break;
} else {
if (get_kernel_nofault(opcode, instr))
--
2.17.1
The following commit has been merged into the x86/mm branch of tip:
Commit-ID: 944fad4583bc8a6d7dd80fbe39db50141da95793
Gitweb: https://git.kernel.org/tip/944fad4583bc8a6d7dd80fbe39db50141da95793
Author: Lukas Bulwahn <lukas.bulwahn@gmail.com>
AuthorDate: Tue, 01 Feb 2022 15:40:55 +01:00
Committer: Borislav Petkov <bp@suse.de>
CommitterDate: Mon, 04 Apr 2022 20:08:26 +02:00
x86/fault: Cast an argument to the proper address space in prefetch()
Commit in Fixes uses accessors based on the access mode, i.e., it
distinguishes its access if instr carries a user address or a kernel
address.
Since that commit, sparse complains about passing an argument without
__user annotation to get_user(), which expects a pointer of the __user
address space:
arch/x86/mm/fault.c:152:29: warning: incorrect type in argument 1 (different address spaces)
arch/x86/mm/fault.c:152:29: expected void const volatile [noderef] __user *ptr
arch/x86/mm/fault.c:152:29: got unsigned char *[assigned] instr
Cast instr to __user when accessing user memory.
No functional change. No change in the generated object code.
[ bp: Simplify commit message. ]
Fixes: 35f1c89b0cce ("x86/fault: Fix AMD erratum #91 errata fixup for user code")
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20220201144055.5670-1-lukas.bulwahn@gmail.com
---
arch/x86/mm/fault.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index d0074c6..fad8faa 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -149,7 +149,7 @@ is_prefetch(struct pt_regs *regs, unsigned long error_code, unsigned long addr)
unsigned char opcode;
if (user_mode(regs)) {
- if (get_user(opcode, instr))
+ if (get_user(opcode, (unsigned char __user *) instr))
break;
} else {
if (get_kernel_nofault(opcode, instr))
© 2016 - 2026 Red Hat, Inc.