report.c (92a38eacd6412bb09f98245ba5b3aa89e3dd6656) report.c (59e6e098d1c156f7c449af903c3b48a5470f6120)
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

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

180 return;
181 }
182
183 if (info->type == KASAN_REPORT_DOUBLE_FREE) {
184 pr_err("BUG: KASAN: double-free in %pS\n", (void *)info->ip);
185 return;
186 }
187
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

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

180 return;
181 }
182
183 if (info->type == KASAN_REPORT_DOUBLE_FREE) {
184 pr_err("BUG: KASAN: double-free in %pS\n", (void *)info->ip);
185 return;
186 }
187
188 pr_err("BUG: KASAN: %s in %pS\n",
189 kasan_get_bug_type(info), (void *)info->ip);
188 pr_err("BUG: KASAN: %s in %pS\n", info->bug_type, (void *)info->ip);
190 if (info->access_size)
191 pr_err("%s of size %zu at addr %px by task %s/%d\n",
192 info->is_write ? "Write" : "Read", info->access_size,
193 info->access_addr, current->comm, task_pid_nr(current));
194 else
195 pr_err("%s at addr %px by task %s/%d\n",
196 info->is_write ? "Write" : "Read",
197 info->access_addr, current->comm, task_pid_nr(current));

--- 39 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
189 if (info->access_size)
190 pr_err("%s of size %zu at addr %px by task %s/%d\n",
191 info->is_write ? "Write" : "Read", info->access_size,
192 info->access_addr, current->comm, task_pid_nr(current));
193 else
194 pr_err("%s at addr %px by task %s/%d\n",
195 info->is_write ? "Write" : "Read",
196 info->access_addr, current->comm, task_pid_nr(current));

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

236 }
237
238 pr_err("The buggy address is located %d bytes %s of\n"
239 " %d-byte region [%px, %px)\n",
240 rel_bytes, rel_type, cache->object_size, (void *)object_addr,
241 (void *)(object_addr + cache->object_size));
242}
243
245static void describe_object_stacks(u8 tag, struct kasan_report_info *info)
244static void describe_object_stacks(struct kasan_report_info *info)
246{
245{
247 struct kasan_track *alloc_track;
248 struct kasan_track *free_track;
249
250 alloc_track = kasan_get_alloc_track(info->cache, info->object);
251 if (alloc_track) {
252 print_track(alloc_track, "Allocated");
246 if (info->alloc_track.stack) {
247 print_track(&info->alloc_track, "Allocated");
253 pr_err("\n");
254 }
255
248 pr_err("\n");
249 }
250
256 free_track = kasan_get_free_track(info->cache, info->object, tag);
257 if (free_track) {
258 print_track(free_track, "Freed");
251 if (info->free_track.stack) {
252 print_track(&info->free_track, "Freed");
259 pr_err("\n");
260 }
261
262 kasan_print_aux_stacks(info->cache, info->object);
263}
264
253 pr_err("\n");
254 }
255
256 kasan_print_aux_stacks(info->cache, info->object);
257}
258
265static void describe_object(const void *addr, u8 tag,
266 struct kasan_report_info *info)
259static void describe_object(const void *addr, struct kasan_report_info *info)
267{
268 if (kasan_stack_collection_enabled())
260{
261 if (kasan_stack_collection_enabled())
269 describe_object_stacks(tag, info);
262 describe_object_stacks(info);
270 describe_object_addr(addr, 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))

--- 12 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) {
263 describe_object_addr(addr, info->cache, info->object);
264}
265
266static inline bool kernel_or_module_addr(const void *addr)
267{
268 if (is_kernel((unsigned long)addr))
269 return true;
270 if (is_module_address((unsigned long)addr))

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

283 struct kasan_report_info *info)
284{
285 struct page *page = addr_to_page(addr);
286
287 dump_stack_lvl(KERN_ERR);
288 pr_err("\n");
289
290 if (info->cache && info->object) {
298 describe_object(addr, tag, info);
291 describe_object(addr, info);
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 }

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

421 info->first_bad_addr = addr;
422
423 slab = kasan_addr_to_slab(addr);
424 if (slab) {
425 info->cache = slab->slab_cache;
426 info->object = nearest_obj(info->cache, slab, addr);
427 } else
428 info->cache = info->object = NULL;
292 pr_err("\n");
293 }
294
295 if (kernel_or_module_addr(addr) && !init_task_stack_addr(addr)) {
296 pr_err("The buggy address belongs to the variable:\n");
297 pr_err(" %pS\n", addr);
298 pr_err("\n");
299 }

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

414 info->first_bad_addr = addr;
415
416 slab = kasan_addr_to_slab(addr);
417 if (slab) {
418 info->cache = slab->slab_cache;
419 info->object = nearest_obj(info->cache, slab, addr);
420 } else
421 info->cache = info->object = NULL;
422
423 /* Fill in mode-specific report info fields. */
424 kasan_complete_mode_report_info(info);
429}
430
431void kasan_report_invalid_free(void *ptr, unsigned long ip, enum kasan_report_type type)
432{
433 unsigned long flags;
434 struct kasan_report_info info;
435
436 /*
437 * Do not check report_suppressed(), as an invalid-free cannot be
438 * caused by accessing slab metadata and thus should not be
439 * suppressed by kasan_disable/enable_current() critical sections.
440 */
441 if (unlikely(!report_enabled()))
442 return;
443
444 start_report(&flags, true);
445
425}
426
427void kasan_report_invalid_free(void *ptr, unsigned long ip, enum kasan_report_type type)
428{
429 unsigned long flags;
430 struct kasan_report_info info;
431
432 /*
433 * Do not check report_suppressed(), as an invalid-free cannot be
434 * caused by accessing slab metadata and thus should not be
435 * suppressed by kasan_disable/enable_current() critical sections.
436 */
437 if (unlikely(!report_enabled()))
438 return;
439
440 start_report(&flags, true);
441
442 memset(&info, 0, sizeof(info));
446 info.type = type;
447 info.access_addr = ptr;
448 info.access_size = 0;
449 info.is_write = false;
450 info.ip = ip;
451
452 complete_report_info(&info);
453

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

472
473 if (unlikely(report_suppressed()) || unlikely(!report_enabled())) {
474 ret = false;
475 goto out;
476 }
477
478 start_report(&irq_flags, true);
479
443 info.type = type;
444 info.access_addr = ptr;
445 info.access_size = 0;
446 info.is_write = false;
447 info.ip = ip;
448
449 complete_report_info(&info);
450

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

469
470 if (unlikely(report_suppressed()) || unlikely(!report_enabled())) {
471 ret = false;
472 goto out;
473 }
474
475 start_report(&irq_flags, true);
476
477 memset(&info, 0, sizeof(info));
480 info.type = KASAN_REPORT_ACCESS;
481 info.access_addr = ptr;
482 info.access_size = size;
483 info.is_write = is_write;
484 info.ip = ip;
485
486 complete_report_info(&info);
487

--- 70 unchanged lines hidden ---
478 info.type = KASAN_REPORT_ACCESS;
479 info.access_addr = ptr;
480 info.access_size = size;
481 info.is_write = is_write;
482 info.ip = ip;
483
484 complete_report_info(&info);
485

--- 70 unchanged lines hidden ---