kasan: add bug reporting routines for tag-based mode
This commit adds rountines, that print tag-based KASAN error reports. Those are quite similar to generic KASAN, the difference is: 1. The way tag-based KASAN finds the first bad shadow cell (with a mismatching tag). Tag-based KASAN compares memory tags from the shadow memory to the pointer tag. 2. Tag-based KASAN reports all bugs with the "KASAN: invalid-access" header. Also simplify generic KASAN find_first_bad_addr. Link: http://lkml.kernel.org/r/aee6897b1bd077732a315fd84c6b4f234dbfdfcb.1544099024.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Andrey Ryabinin <aryabinin@virtuozzo.com> Reviewed-by: Dmitry Vyukov <dvyukov@google.com> Cc: Christoph Lameter <cl@linux.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Šī revīzija ir iekļauta:

revīziju iesūtīja
Linus Torvalds

vecāks
11cd3cd69a
revīzija
121e8f81d3
@@ -33,16 +33,13 @@
|
||||
#include "kasan.h"
|
||||
#include "../slab.h"
|
||||
|
||||
static const void *find_first_bad_addr(const void *addr, size_t size)
|
||||
void *find_first_bad_addr(void *addr, size_t size)
|
||||
{
|
||||
u8 shadow_val = *(u8 *)kasan_mem_to_shadow(addr);
|
||||
const void *first_bad_addr = addr;
|
||||
void *p = addr;
|
||||
|
||||
while (!shadow_val && first_bad_addr < addr + size) {
|
||||
first_bad_addr += KASAN_SHADOW_SCALE_SIZE;
|
||||
shadow_val = *(u8 *)kasan_mem_to_shadow(first_bad_addr);
|
||||
}
|
||||
return first_bad_addr;
|
||||
while (p < addr + size && !(*(u8 *)kasan_mem_to_shadow(p)))
|
||||
p += KASAN_SHADOW_SCALE_SIZE;
|
||||
return p;
|
||||
}
|
||||
|
||||
static const char *get_shadow_bug_type(struct kasan_access_info *info)
|
||||
@@ -50,9 +47,6 @@ static const char *get_shadow_bug_type(struct kasan_access_info *info)
|
||||
const char *bug_type = "unknown-crash";
|
||||
u8 *shadow_addr;
|
||||
|
||||
info->first_bad_addr = find_first_bad_addr(info->access_addr,
|
||||
info->access_size);
|
||||
|
||||
shadow_addr = (u8 *)kasan_mem_to_shadow(info->first_bad_addr);
|
||||
|
||||
/*
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user