diff options
Diffstat (limited to 'mm/kasan/kasan.c')
| -rw-r--r-- | mm/kasan/kasan.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index 88af13c00d3c..70c009741aab 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/string.h> | 34 | #include <linux/string.h> |
| 35 | #include <linux/types.h> | 35 | #include <linux/types.h> |
| 36 | #include <linux/vmalloc.h> | 36 | #include <linux/vmalloc.h> |
| 37 | #include <linux/bug.h> | ||
| 37 | 38 | ||
| 38 | #include "kasan.h" | 39 | #include "kasan.h" |
| 39 | #include "../slab.h" | 40 | #include "../slab.h" |
| @@ -62,7 +63,7 @@ void kasan_unpoison_shadow(const void *address, size_t size) | |||
| 62 | } | 63 | } |
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | static void __kasan_unpoison_stack(struct task_struct *task, void *sp) | 66 | static void __kasan_unpoison_stack(struct task_struct *task, const void *sp) |
| 66 | { | 67 | { |
| 67 | void *base = task_stack_page(task); | 68 | void *base = task_stack_page(task); |
| 68 | size_t size = sp - base; | 69 | size_t size = sp - base; |
| @@ -77,9 +78,24 @@ void kasan_unpoison_task_stack(struct task_struct *task) | |||
| 77 | } | 78 | } |
| 78 | 79 | ||
| 79 | /* Unpoison the stack for the current task beyond a watermark sp value. */ | 80 | /* Unpoison the stack for the current task beyond a watermark sp value. */ |
| 80 | asmlinkage void kasan_unpoison_remaining_stack(void *sp) | 81 | asmlinkage void kasan_unpoison_task_stack_below(const void *watermark) |
| 81 | { | 82 | { |
| 82 | __kasan_unpoison_stack(current, sp); | 83 | __kasan_unpoison_stack(current, watermark); |
| 84 | } | ||
| 85 | |||
| 86 | /* | ||
| 87 | * Clear all poison for the region between the current SP and a provided | ||
| 88 | * watermark value, as is sometimes required prior to hand-crafted asm function | ||
| 89 | * returns in the middle of functions. | ||
| 90 | */ | ||
| 91 | void kasan_unpoison_stack_above_sp_to(const void *watermark) | ||
| 92 | { | ||
| 93 | const void *sp = __builtin_frame_address(0); | ||
| 94 | size_t size = watermark - sp; | ||
| 95 | |||
| 96 | if (WARN_ON(sp > watermark)) | ||
| 97 | return; | ||
| 98 | kasan_unpoison_shadow(sp, size); | ||
| 83 | } | 99 | } |
| 84 | 100 | ||
| 85 | /* | 101 | /* |
