|
@@ -34,6 +34,7 @@
|
|
|
#include <linux/string.h>
|
|
|
#include <linux/types.h>
|
|
|
#include <linux/vmalloc.h>
|
|
|
+#include <linux/bug.h>
|
|
|
|
|
|
#include "kasan.h"
|
|
|
#include "../slab.h"
|
|
@@ -62,7 +63,7 @@ void kasan_unpoison_shadow(const void *address, size_t size)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void __kasan_unpoison_stack(struct task_struct *task, void *sp)
|
|
|
+static void __kasan_unpoison_stack(struct task_struct *task, const void *sp)
|
|
|
{
|
|
|
void *base = task_stack_page(task);
|
|
|
size_t size = sp - base;
|
|
@@ -77,9 +78,24 @@ 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_remaining_stack(void *sp)
|
|
|
+asmlinkage void kasan_unpoison_task_stack_below(const void *watermark)
|
|
|
{
|
|
|
- __kasan_unpoison_stack(current, sp);
|
|
|
+ __kasan_unpoison_stack(current, watermark);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Clear all poison for the region between the current SP and a provided
|
|
|
+ * watermark value, as is sometimes required prior to hand-crafted asm function
|
|
|
+ * returns in the middle of functions.
|
|
|
+ */
|
|
|
+void kasan_unpoison_stack_above_sp_to(const void *watermark)
|
|
|
+{
|
|
|
+ const void *sp = __builtin_frame_address(0);
|
|
|
+ size_t size = watermark - sp;
|
|
|
+
|
|
|
+ if (WARN_ON(sp > watermark))
|
|
|
+ return;
|
|
|
+ kasan_unpoison_shadow(sp, size);
|
|
|
}
|
|
|
|
|
|
/*
|