kasan: introduce kasan_print_aux_stacks
Add a kasan_print_aux_stacks() helper that prints the auxiliary stack traces for the Generic mode. This change hides references to alloc_meta from the common reporting code. This is desired as only the Generic mode will be using per-object metadata after this series. Link: https://lkml.kernel.org/r/67c7a9ea6615533762b1f8ccc267cd7f9bafb749.1662411799.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Marco Elver <elver@google.com> Cc: Alexander Potapenko <glider@google.com> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Evgenii Stepanov <eugenis@google.com> Cc: Peter Collingbourne <pcc@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
687c85afa6
commit
88f29765ae
|
@ -266,6 +266,12 @@ void kasan_print_address_stack_frame(const void *addr);
|
|||
static inline void kasan_print_address_stack_frame(const void *addr) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KASAN_GENERIC
|
||||
void kasan_print_aux_stacks(struct kmem_cache *cache, const void *object);
|
||||
#else
|
||||
static inline void kasan_print_aux_stacks(struct kmem_cache *cache, const void *object) { }
|
||||
#endif
|
||||
|
||||
bool kasan_report(unsigned long addr, size_t size,
|
||||
bool is_write, unsigned long ip);
|
||||
void kasan_report_invalid_free(void *object, unsigned long ip, enum kasan_report_type type);
|
||||
|
|
|
@ -270,20 +270,7 @@ static void describe_object_stacks(struct kmem_cache *cache, void *object,
|
|||
pr_err("\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KASAN_GENERIC
|
||||
if (!alloc_meta)
|
||||
return;
|
||||
if (alloc_meta->aux_stack[0]) {
|
||||
pr_err("Last potentially related work creation:\n");
|
||||
stack_depot_print(alloc_meta->aux_stack[0]);
|
||||
pr_err("\n");
|
||||
}
|
||||
if (alloc_meta->aux_stack[1]) {
|
||||
pr_err("Second to last potentially related work creation:\n");
|
||||
stack_depot_print(alloc_meta->aux_stack[1]);
|
||||
pr_err("\n");
|
||||
}
|
||||
#endif
|
||||
kasan_print_aux_stacks(cache, object);
|
||||
}
|
||||
|
||||
static void describe_object(struct kmem_cache *cache, void *object,
|
||||
|
|
|
@ -132,6 +132,26 @@ void kasan_metadata_fetch_row(char *buffer, void *row)
|
|||
memcpy(buffer, kasan_mem_to_shadow(row), META_BYTES_PER_ROW);
|
||||
}
|
||||
|
||||
void kasan_print_aux_stacks(struct kmem_cache *cache, const void *object)
|
||||
{
|
||||
struct kasan_alloc_meta *alloc_meta;
|
||||
|
||||
alloc_meta = kasan_get_alloc_meta(cache, object);
|
||||
if (!alloc_meta)
|
||||
return;
|
||||
|
||||
if (alloc_meta->aux_stack[0]) {
|
||||
pr_err("Last potentially related work creation:\n");
|
||||
stack_depot_print(alloc_meta->aux_stack[0]);
|
||||
pr_err("\n");
|
||||
}
|
||||
if (alloc_meta->aux_stack[1]) {
|
||||
pr_err("Second to last potentially related work creation:\n");
|
||||
stack_depot_print(alloc_meta->aux_stack[1]);
|
||||
pr_err("\n");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KASAN_STACK
|
||||
static bool __must_check tokenize_frame_descr(const char **frame_descr,
|
||||
char *token, size_t max_tok_len,
|
||||
|
|
Loading…
Reference in New Issue