mirror of https://github.com/OpenIPC/firmware.git
96 lines
3.0 KiB
Diff
96 lines
3.0 KiB
Diff
diff -drupN a/mm/kasan/kasan.c b/mm/kasan/kasan.c
|
|
--- a/mm/kasan/kasan.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/mm/kasan/kasan.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -39,6 +39,16 @@
|
|
#include "kasan.h"
|
|
#include "../slab.h"
|
|
|
|
+void kasan_enable_current(void)
|
|
+{
|
|
+ current->kasan_depth++;
|
|
+}
|
|
+
|
|
+void kasan_disable_current(void)
|
|
+{
|
|
+ current->kasan_depth--;
|
|
+}
|
|
+
|
|
/*
|
|
* Poisons the shadow memory for 'size' bytes starting from 'addr'.
|
|
* Memory addresses should be aligned to KASAN_SHADOW_SCALE_SIZE.
|
|
@@ -428,7 +438,7 @@ void kasan_cache_shrink(struct kmem_cach
|
|
quarantine_remove_cache(cache);
|
|
}
|
|
|
|
-void kasan_cache_destroy(struct kmem_cache *cache)
|
|
+void kasan_cache_shutdown(struct kmem_cache *cache)
|
|
{
|
|
quarantine_remove_cache(cache);
|
|
}
|
|
@@ -559,7 +569,8 @@ bool kasan_slab_free(struct kmem_cache *
|
|
|
|
shadow_byte = READ_ONCE(*(s8 *)kasan_mem_to_shadow(object));
|
|
if (shadow_byte < 0 || shadow_byte >= KASAN_SHADOW_SCALE_SIZE) {
|
|
- kasan_report_double_free(cache, object, shadow_byte);
|
|
+ kasan_report_double_free(cache, object,
|
|
+ __builtin_return_address(1));
|
|
return true;
|
|
}
|
|
|
|
@@ -783,6 +794,55 @@ void __asan_unpoison_stack_memory(const
|
|
}
|
|
EXPORT_SYMBOL(__asan_unpoison_stack_memory);
|
|
|
|
+/* Emitted by compiler to poison alloca()ed objects. */
|
|
+void __asan_alloca_poison(unsigned long addr, size_t size)
|
|
+{
|
|
+ size_t rounded_up_size = round_up(size, KASAN_SHADOW_SCALE_SIZE);
|
|
+ size_t padding_size = round_up(size, KASAN_ALLOCA_REDZONE_SIZE) -
|
|
+ rounded_up_size;
|
|
+ size_t rounded_down_size = round_down(size, KASAN_SHADOW_SCALE_SIZE);
|
|
+
|
|
+ const void *left_redzone = (const void *)(addr -
|
|
+ KASAN_ALLOCA_REDZONE_SIZE);
|
|
+ const void *right_redzone = (const void *)(addr + rounded_up_size);
|
|
+
|
|
+ WARN_ON(!IS_ALIGNED(addr, KASAN_ALLOCA_REDZONE_SIZE));
|
|
+
|
|
+ kasan_unpoison_shadow((const void *)(addr + rounded_down_size),
|
|
+ size - rounded_down_size);
|
|
+ kasan_poison_shadow(left_redzone, KASAN_ALLOCA_REDZONE_SIZE,
|
|
+ KASAN_ALLOCA_LEFT);
|
|
+ kasan_poison_shadow(right_redzone,
|
|
+ padding_size + KASAN_ALLOCA_REDZONE_SIZE,
|
|
+ KASAN_ALLOCA_RIGHT);
|
|
+}
|
|
+EXPORT_SYMBOL(__asan_alloca_poison);
|
|
+
|
|
+/* Emitted by compiler to unpoison alloca()ed areas when the stack unwinds. */
|
|
+void __asan_allocas_unpoison(const void *stack_top, const void *stack_bottom)
|
|
+{
|
|
+ if (unlikely(!stack_top || stack_top > stack_bottom))
|
|
+ return;
|
|
+
|
|
+ kasan_unpoison_shadow(stack_top, stack_bottom - stack_top);
|
|
+}
|
|
+EXPORT_SYMBOL(__asan_allocas_unpoison);
|
|
+
|
|
+/* Emitted by the compiler to [un]poison local variables. */
|
|
+#define DEFINE_ASAN_SET_SHADOW(byte) \
|
|
+ void __asan_set_shadow_##byte(const void *addr, size_t size) \
|
|
+ { \
|
|
+ __memset((void *)addr, 0x##byte, size); \
|
|
+ } \
|
|
+ EXPORT_SYMBOL(__asan_set_shadow_##byte)
|
|
+
|
|
+DEFINE_ASAN_SET_SHADOW(00);
|
|
+DEFINE_ASAN_SET_SHADOW(f1);
|
|
+DEFINE_ASAN_SET_SHADOW(f2);
|
|
+DEFINE_ASAN_SET_SHADOW(f3);
|
|
+DEFINE_ASAN_SET_SHADOW(f5);
|
|
+DEFINE_ASAN_SET_SHADOW(f8);
|
|
+
|
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
|
static int kasan_mem_notifier(struct notifier_block *nb,
|
|
unsigned long action, void *data)
|