Re: [PATCH v2] x86/suspend: fix false positive KASAN warning on suspend/resume

From
Josh Poimboeuf <hidden>
Date
2016-12-02 14:01:51
Also in
lkml
Reply to
Andrey Ryabinin, 2016-12-02
On Fri, Dec 02, 2016 at 04:41:09PM +0300, Andrey Ryabinin wrote:
quoted hunk ↗ jump to hunk

On 12/01/2016 11:31 PM, Josh Poimboeuf wrote:
quoted
 arch/x86/kernel/acpi/wakeup_64.S | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
diff --git a/arch/x86/kernel/acpi/wakeup_64.S b/arch/x86/kernel/acpi/wakeup_64.S
index 169963f..1df9b75 100644
--- a/arch/x86/kernel/acpi/wakeup_64.S
+++ b/arch/x86/kernel/acpi/wakeup_64.S
@@ -109,6 +109,22 @@ ENTRY(do_suspend_lowlevel)
 	movq	pt_regs_r14(%rax), %r14
 	movq	pt_regs_r15(%rax), %r15
 
+#ifdef CONFIG_KASAN
+	/*
+	 * The suspend path may have poisoned some areas deeper in the stack,
+	 * which we now need to unpoison.
+	 *
+	 * We can't call kasan_unpoison_task_stack_below() because it uses %gs
+	 * for 'current', which hasn't been set up yet.  Instead, calculate the
+	 * stack range manually and call kasan_unpoison_shadow().
+	 */
+	movq	%rsp, %rdi
+	andq	$CURRENT_MASK, %rdi
+	movq	%rsp, %rsi
+	xorq	%rdi, %rsi
+	call	kasan_unpoison_shadow
+#endif
+
Looks good, but in fact we can use kasan_unpoison_task_stack_below(). We just need to change it a little:
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c
index 70c0097..e779236 100644
--- a/mm/kasan/kasan.c
+++ b/mm/kasan/kasan.c
@@ -80,7 +80,9 @@ void kasan_unpoison_task_stack(struct task_struct *task)
 /* Unpoison the stack for the current task beyond a watermark sp value. */
 asmlinkage void kasan_unpoison_task_stack_below(const void *watermark)
 {
-       __kasan_unpoison_stack(current, watermark);
+       void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1));
+
+       kasan_unpoison_shadow(base, watermark - base);
 }

With this we don't have to calculate stack range in assembly.
That is better indeed, will do a v3.

-- 
Josh
Thread (28 messages) 28 messages, 7 authors, last reply 2016-12-08
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help