kasan: introduce kasan_print_aux_stacks
authorAndrey Konovalov <andreyknvl@google.com>
Mon, 5 Sep 2022 21:05:21 +0000 (23:05 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 3 Oct 2022 21:02:57 +0000 (14:02 -0700)
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>
mm/kasan/kasan.h
mm/kasan/report.c
mm/kasan/report_generic.c

index 15c718782c1fafd48ef79d151b2fb7f542d348dd..30ff341b6d35e9517ec0fbf9f1a0a57574e2f160 100644 (file)
@@ -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);
index fe3f606b3a9867af9fc8db923fc638f923a0f4d3..cd9f5c7fc6db1e5d7dbce344c71a3a1ac47792d3 100644 (file)
@@ -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,
index 6689fb9a919b1d72a5afc56cf05f1f46b6244b30..348dc207d46230c1259243f1eeac79ac30b50db5 100644 (file)
@@ -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,