report.c (7fae3dd08e3e88491f06e22e648913e3f8cf30f0) report.c (92a38eacd6412bb09f98245ba5b3aa89e3dd6656)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * This file contains common KASAN error reporting code.
4 *
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
7 *
8 * Some code borrowed from https://github.com/xairy/kasan-prototype by

--- 199 unchanged lines hidden (view full) ---

208
209static inline struct page *addr_to_page(const void *addr)
210{
211 if (virt_addr_valid(addr))
212 return virt_to_head_page(addr);
213 return NULL;
214}
215
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * This file contains common KASAN error reporting code.
4 *
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 * Author: Andrey Ryabinin <ryabinin.a.a@gmail.com>
7 *
8 * Some code borrowed from https://github.com/xairy/kasan-prototype by

--- 199 unchanged lines hidden (view full) ---

208
209static inline struct page *addr_to_page(const void *addr)
210{
211 if (virt_addr_valid(addr))
212 return virt_to_head_page(addr);
213 return NULL;
214}
215
216static void describe_object_addr(struct kmem_cache *cache, void *object,
217 const void *addr)
216static void describe_object_addr(const void *addr, struct kmem_cache *cache,
217 void *object)
218{
219 unsigned long access_addr = (unsigned long)addr;
220 unsigned long object_addr = (unsigned long)object;
221 const char *rel_type;
222 int rel_bytes;
223
224 pr_err("The buggy address belongs to the object at %px\n"
225 " which belongs to the cache %s of size %d\n",

--- 11 unchanged lines hidden (view full) ---

237 }
238
239 pr_err("The buggy address is located %d bytes %s of\n"
240 " %d-byte region [%px, %px)\n",
241 rel_bytes, rel_type, cache->object_size, (void *)object_addr,
242 (void *)(object_addr + cache->object_size));
243}
244
218{
219 unsigned long access_addr = (unsigned long)addr;
220 unsigned long object_addr = (unsigned long)object;
221 const char *rel_type;
222 int rel_bytes;
223
224 pr_err("The buggy address belongs to the object at %px\n"
225 " which belongs to the cache %s of size %d\n",

--- 11 unchanged lines hidden (view full) ---

237 }
238
239 pr_err("The buggy address is located %d bytes %s of\n"
240 " %d-byte region [%px, %px)\n",
241 rel_bytes, rel_type, cache->object_size, (void *)object_addr,
242 (void *)(object_addr + cache->object_size));
243}
244
245static void describe_object_stacks(struct kmem_cache *cache, void *object,
246 const void *addr, u8 tag)
245static void describe_object_stacks(u8 tag, struct kasan_report_info *info)
247{
248 struct kasan_track *alloc_track;
249 struct kasan_track *free_track;
250
246{
247 struct kasan_track *alloc_track;
248 struct kasan_track *free_track;
249
251 alloc_track = kasan_get_alloc_track(cache, object);
250 alloc_track = kasan_get_alloc_track(info->cache, info->object);
252 if (alloc_track) {
253 print_track(alloc_track, "Allocated");
254 pr_err("\n");
255 }
256
251 if (alloc_track) {
252 print_track(alloc_track, "Allocated");
253 pr_err("\n");
254 }
255
257 free_track = kasan_get_free_track(cache, object, tag);
256 free_track = kasan_get_free_track(info->cache, info->object, tag);
258 if (free_track) {
259 print_track(free_track, "Freed");
260 pr_err("\n");
261 }
262
257 if (free_track) {
258 print_track(free_track, "Freed");
259 pr_err("\n");
260 }
261
263 kasan_print_aux_stacks(cache, object);
262 kasan_print_aux_stacks(info->cache, info->object);
264}
265
263}
264
266static void describe_object(struct kmem_cache *cache, void *object,
267 const void *addr, u8 tag)
265static void describe_object(const void *addr, u8 tag,
266 struct kasan_report_info *info)
268{
269 if (kasan_stack_collection_enabled())
267{
268 if (kasan_stack_collection_enabled())
270 describe_object_stacks(cache, object, addr, tag);
271 describe_object_addr(cache, object, addr);
269 describe_object_stacks(tag, info);
270 describe_object_addr(addr, info->cache, info->object);
272}
273
274static inline bool kernel_or_module_addr(const void *addr)
275{
276 if (is_kernel((unsigned long)addr))
277 return true;
278 if (is_module_address((unsigned long)addr))
279 return true;

--- 11 unchanged lines hidden (view full) ---

291 struct kasan_report_info *info)
292{
293 struct page *page = addr_to_page(addr);
294
295 dump_stack_lvl(KERN_ERR);
296 pr_err("\n");
297
298 if (info->cache && info->object) {
271}
272
273static inline bool kernel_or_module_addr(const void *addr)
274{
275 if (is_kernel((unsigned long)addr))
276 return true;
277 if (is_module_address((unsigned long)addr))
278 return true;

--- 11 unchanged lines hidden (view full) ---

290 struct kasan_report_info *info)
291{
292 struct page *page = addr_to_page(addr);
293
294 dump_stack_lvl(KERN_ERR);
295 pr_err("\n");
296
297 if (info->cache && info->object) {
299 describe_object(info->cache, info->object, addr, tag);
298 describe_object(addr, tag, info);
300 pr_err("\n");
301 }
302
303 if (kernel_or_module_addr(addr) && !init_task_stack_addr(addr)) {
304 pr_err("The buggy address belongs to the variable:\n");
305 pr_err(" %pS\n", addr);
306 pr_err("\n");
307 }

--- 251 unchanged lines hidden ---
299 pr_err("\n");
300 }
301
302 if (kernel_or_module_addr(addr) && !init_task_stack_addr(addr)) {
303 pr_err("The buggy address belongs to the variable:\n");
304 pr_err(" %pS\n", addr);
305 pr_err("\n");
306 }

--- 251 unchanged lines hidden ---