Merge tag 'linux-watchdog-5.11-rc1' of git://www.linux-watchdog.org/linux-watchdog
[linux-2.6-microblaze.git] / mm / kasan / report.c
index 00c590e..c0fb217 100644 (file)
@@ -99,6 +99,10 @@ static void end_report(unsigned long *flags)
                panic_on_warn = 0;
                panic("panic_on_warn set ...\n");
        }
+#ifdef CONFIG_KASAN_HW_TAGS
+       if (kasan_flag_panic)
+               panic("kasan.fault=panic set ...\n");
+#endif
        kasan_enable_current();
 }
 
@@ -161,36 +165,45 @@ static void describe_object_addr(struct kmem_cache *cache, void *object,
                (void *)(object_addr + cache->object_size));
 }
 
-static void describe_object(struct kmem_cache *cache, void *object,
-                               const void *addr, u8 tag)
+static void describe_object_stacks(struct kmem_cache *cache, void *object,
+                                       const void *addr, u8 tag)
 {
-       struct kasan_alloc_meta *alloc_meta = kasan_get_alloc_meta(cache, object);
-
-       if (cache->flags & SLAB_KASAN) {
-               struct kasan_track *free_track;
+       struct kasan_alloc_meta *alloc_meta;
+       struct kasan_track *free_track;
 
+       alloc_meta = kasan_get_alloc_meta(cache, object);
+       if (alloc_meta) {
                print_track(&alloc_meta->alloc_track, "Allocated");
                pr_err("\n");
-               free_track = kasan_get_free_track(cache, object, tag);
-               if (free_track) {
-                       print_track(free_track, "Freed");
-                       pr_err("\n");
-               }
+       }
+
+       free_track = kasan_get_free_track(cache, object, tag);
+       if (free_track) {
+               print_track(free_track, "Freed");
+               pr_err("\n");
+       }
 
 #ifdef CONFIG_KASAN_GENERIC
-               if (alloc_meta->aux_stack[0]) {
-                       pr_err("Last potentially related work creation:\n");
-                       print_stack(alloc_meta->aux_stack[0]);
-                       pr_err("\n");
-               }
-               if (alloc_meta->aux_stack[1]) {
-                       pr_err("Second to last potentially related work creation:\n");
-                       print_stack(alloc_meta->aux_stack[1]);
-                       pr_err("\n");
-               }
-#endif
+       if (!alloc_meta)
+               return;
+       if (alloc_meta->aux_stack[0]) {
+               pr_err("Last potentially related work creation:\n");
+               print_stack(alloc_meta->aux_stack[0]);
+               pr_err("\n");
        }
+       if (alloc_meta->aux_stack[1]) {
+               pr_err("Second to last potentially related work creation:\n");
+               print_stack(alloc_meta->aux_stack[1]);
+               pr_err("\n");
+       }
+#endif
+}
 
+static void describe_object(struct kmem_cache *cache, void *object,
+                               const void *addr, u8 tag)
+{
+       if (kasan_stack_collection_enabled())
+               describe_object_stacks(cache, object, addr, tag);
        describe_object_addr(cache, object, addr);
 }