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 --- |