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

From
Dmitry Vyukov <dvyukov@google.com>
Date
2016-12-02 14:03:10
Also in
lkml
Reply to
Josh Poimboeuf, 2016-12-02
On Fri, Dec 2, 2016 at 3:01 PM, Josh Poimboeuf [off-list ref] wrote:
On Fri, Dec 02, 2016 at 04:41:09PM +0300, Andrey Ryabinin wrote:
quoted

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.
agree
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