|
@@ -189,9 +189,10 @@ static void print_shadow_for_address(const void *addr)
|
|
|
|
|
|
static DEFINE_SPINLOCK(report_lock);
|
|
|
|
|
|
-void kasan_report_error(struct kasan_access_info *info)
|
|
|
+static void kasan_report_error(struct kasan_access_info *info)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
+ const char *bug_type;
|
|
|
|
|
|
/*
|
|
|
* Make sure we don't end up in loop.
|
|
@@ -200,32 +201,26 @@ void kasan_report_error(struct kasan_access_info *info)
|
|
|
spin_lock_irqsave(&report_lock, flags);
|
|
|
pr_err("================================="
|
|
|
"=================================\n");
|
|
|
- print_error_description(info);
|
|
|
- print_address_description(info);
|
|
|
- print_shadow_for_address(info->first_bad_addr);
|
|
|
- pr_err("================================="
|
|
|
- "=================================\n");
|
|
|
- spin_unlock_irqrestore(&report_lock, flags);
|
|
|
- kasan_enable_current();
|
|
|
-}
|
|
|
-
|
|
|
-void kasan_report_user_access(struct kasan_access_info *info)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- /*
|
|
|
- * Make sure we don't end up in loop.
|
|
|
- */
|
|
|
- kasan_disable_current();
|
|
|
- spin_lock_irqsave(&report_lock, flags);
|
|
|
- pr_err("================================="
|
|
|
- "=================================\n");
|
|
|
- pr_err("BUG: KASan: user-memory-access on address %p\n",
|
|
|
- info->access_addr);
|
|
|
- pr_err("%s of size %zu by task %s/%d\n",
|
|
|
- info->is_write ? "Write" : "Read",
|
|
|
- info->access_size, current->comm, task_pid_nr(current));
|
|
|
- dump_stack();
|
|
|
+ if (info->access_addr <
|
|
|
+ kasan_shadow_to_mem((void *)KASAN_SHADOW_START)) {
|
|
|
+ if ((unsigned long)info->access_addr < PAGE_SIZE)
|
|
|
+ bug_type = "null-ptr-deref";
|
|
|
+ else if ((unsigned long)info->access_addr < TASK_SIZE)
|
|
|
+ bug_type = "user-memory-access";
|
|
|
+ else
|
|
|
+ bug_type = "wild-memory-access";
|
|
|
+ pr_err("BUG: KASan: %s on address %p\n",
|
|
|
+ bug_type, info->access_addr);
|
|
|
+ pr_err("%s of size %zu by task %s/%d\n",
|
|
|
+ info->is_write ? "Write" : "Read",
|
|
|
+ info->access_size, current->comm,
|
|
|
+ task_pid_nr(current));
|
|
|
+ dump_stack();
|
|
|
+ } else {
|
|
|
+ print_error_description(info);
|
|
|
+ print_address_description(info);
|
|
|
+ print_shadow_for_address(info->first_bad_addr);
|
|
|
+ }
|
|
|
pr_err("================================="
|
|
|
"=================================\n");
|
|
|
spin_unlock_irqrestore(&report_lock, flags);
|
|
@@ -244,6 +239,7 @@ void kasan_report(unsigned long addr, size_t size,
|
|
|
info.access_size = size;
|
|
|
info.is_write = is_write;
|
|
|
info.ip = ip;
|
|
|
+
|
|
|
kasan_report_error(&info);
|
|
|
}
|
|
|
|