| @@ -108,7 +108,7 @@ void *memcpy(void *dest, const void *src, size_t len) · 107 unmodified lines |
| 108 | * Poisons the shadow memory for 'size' bytes starting from 'addr'. | 108 | * Poisons the shadow memory for 'size' bytes starting from 'addr'. |
| 109 | * Memory addresses should be aligned to KASAN_SHADOW_SCALE_SIZE. | 109 | * Memory addresses should be aligned to KASAN_SHADOW_SCALE_SIZE. |
| 110 | */ | 110 | */ |
| 111 | void kasan_poison_shadow(const void *address, size_t size, u8 value) | 111 | void poison_range(const void *address, size_t size, u8 value) |
| 112 | { | 112 | { |
| 113 | void *shadow_start, *shadow_end; | 113 | void *shadow_start, *shadow_end; |
| 114 | | 114 | |
| @@ -125,7 +125,7 @@ void kasan_poison_shadow(const void *address, size_t size, u8 value) · 10 unmodified lines |
| 125 | __memset(shadow_start, value, shadow_end - shadow_start); | 125 | __memset(shadow_start, value, shadow_end - shadow_start); |
| 126 | } | 126 | } |
| 127 | | 127 | |
| 128 | void kasan_unpoison_shadow(const void *address, size_t size) | 128 | void unpoison_range(const void *address, size_t size) |
| 129 | { | 129 | { |
| 130 | u8 tag = get_tag(address); | 130 | u8 tag = get_tag(address); |
| 131 | | 131 | |
| @@ -136,7 +136,7 @@ void kasan_unpoison_shadow(const void *address, size_t size) · 4 unmodified lines |
| 136 | */ | 136 | */ |
| 137 | address = reset_tag(address); | 137 | address = reset_tag(address); |
| 138 | | 138 | |
| 139 | kasan_poison_shadow(address, size, tag); | 139 | poison_range(address, size, tag); |
| 140 | | 140 | |
| 141 | if (size & KASAN_SHADOW_MASK) { | 141 | if (size & KASAN_SHADOW_MASK) { |
| 142 | u8 *shadow = (u8 *)kasan_mem_to_shadow(address + size); | 142 | u8 *shadow = (u8 *)kasan_mem_to_shadow(address + size); |
| @@ -148,12 +148,17 @@ void kasan_unpoison_shadow(const void *address, size_t size) · 5 unmodified lines |
| 148 | } | 148 | } |
| 149 | } | 149 | } |
| 150 | | 150 | |
| | 151 | void kasan_unpoison_range(const void *address, size_t size) |
| | 152 | { |
| | 153 | unpoison_range(address, size); |
| | 154 | } |
| | 155 | |
| 151 | static void __kasan_unpoison_stack(struct task_struct *task, const void *sp) | 156 | static void __kasan_unpoison_stack(struct task_struct *task, const void *sp) |
| 152 | { | 157 | { |
| 153 | void *base = task_stack_page(task); | 158 | void *base = task_stack_page(task); |
| 154 | size_t size = sp - base; | 159 | size_t size = sp - base; |
| 155 | | 160 | |
| 156 | kasan_unpoison_shadow(base, size); | 161 | unpoison_range(base, size); |
| 157 | } | 162 | } |
| 158 | | 163 | |
| 159 | /* Unpoison the entire stack for a task. */ | 164 | /* Unpoison the entire stack for a task. */ |
| @@ -172,7 +177,7 @@ asmlinkage void kasan_unpoison_task_stack_below(const void *watermark) · 12 unmodified lines |
| 172 | */ | 177 | */ |
| 173 | void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1)); | 178 | void *base = (void *)((unsigned long)watermark & ~(THREAD_SIZE - 1)); |
| 174 | | 179 | |
| 175 | kasan_unpoison_shadow(base, watermark - base); | 180 | unpoison_range(base, watermark - base); |
| 176 | } | 181 | } |
| 177 | | 182 | |
| 178 | void kasan_alloc_pages(struct page *page, unsigned int order) | 183 | void kasan_alloc_pages(struct page *page, unsigned int order) |
| @@ -186,13 +191,13 @@ void kasan_alloc_pages(struct page *page, unsigned int order) · 7 unmodified lines |
| 186 | tag = random_tag(); | 191 | tag = random_tag(); |
| 187 | for (i = 0; i < (1 << order); i++) | 192 | for (i = 0; i < (1 << order); i++) |
| 188 | page_kasan_tag_set(page + i, tag); | 193 | page_kasan_tag_set(page + i, tag); |
| 189 | kasan_unpoison_shadow(page_address(page), PAGE_SIZE << order); | 194 | unpoison_range(page_address(page), PAGE_SIZE << order); |
| 190 | } | 195 | } |
| 191 | | 196 | |
| 192 | void kasan_free_pages(struct page *page, unsigned int order) | 197 | void kasan_free_pages(struct page *page, unsigned int order) |
| 193 | { | 198 | { |
| 194 | if (likely(!PageHighMem(page))) | 199 | if (likely(!PageHighMem(page))) |
| 195 | kasan_poison_shadow(page_address(page), | 200 | poison_range(page_address(page), |
| 196 | PAGE_SIZE << order, | 201 | PAGE_SIZE << order, |
| 197 | KASAN_FREE_PAGE); | 202 | KASAN_FREE_PAGE); |
| 198 | } | 203 | } |
| @@ -284,18 +289,18 @@ void kasan_poison_slab(struct page *page) · 85 unmodified lines |
| 284 | | 289 | |
| 285 | for (i = 0; i < compound_nr(page); i++) | 290 | for (i = 0; i < compound_nr(page); i++) |
| 286 | page_kasan_tag_reset(page + i); | 291 | page_kasan_tag_reset(page + i); |
| 287 | kasan_poison_shadow(page_address(page), page_size(page), | 292 | poison_range(page_address(page), page_size(page), |
| 288 | KASAN_KMALLOC_REDZONE); | 293 | KASAN_KMALLOC_REDZONE); |
| 289 | } | 294 | } |
| 290 | | 295 | |
| 291 | void kasan_unpoison_object_data(struct kmem_cache *cache, void *object) | 296 | void kasan_unpoison_object_data(struct kmem_cache *cache, void *object) |
| 292 | { | 297 | { |
| 293 | kasan_unpoison_shadow(object, cache->object_size); | 298 | unpoison_range(object, cache->object_size); |
| 294 | } | 299 | } |
| 295 | | 300 | |
| 296 | void kasan_poison_object_data(struct kmem_cache *cache, void *object) | 301 | void kasan_poison_object_data(struct kmem_cache *cache, void *object) |
| 297 | { | 302 | { |
| 298 | kasan_poison_shadow(object, | 303 | poison_range(object, |
| 299 | round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE), | 304 | round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE), |
| 300 | KASAN_KMALLOC_REDZONE); | 305 | KASAN_KMALLOC_REDZONE); |
| 301 | } | 306 | } |
| @@ -408,7 +413,7 @@ static bool __kasan_slab_free(struct kmem_cache *cache, void *object, · 106 unmodified lines |
| 408 | } | 413 | } |
| 409 | | 414 | |
| 410 | rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE); | 415 | rounded_up_size = round_up(cache->object_size, KASAN_SHADOW_SCALE_SIZE); |
| 411 | kasan_poison_shadow(object, rounded_up_size, KASAN_KMALLOC_FREE); | 416 | poison_range(object, rounded_up_size, KASAN_KMALLOC_FREE); |
| 412 | | 417 | |
| 413 | if ((IS_ENABLED(CONFIG_KASAN_GENERIC) && !quarantine) || | 418 | if ((IS_ENABLED(CONFIG_KASAN_GENERIC) && !quarantine) || |
| 414 | unlikely(!(cache->flags & SLAB_KASAN))) | 419 | unlikely(!(cache->flags & SLAB_KASAN))) |
| @@ -448,9 +453,9 @@ static void *__kasan_kmalloc(struct kmem_cache *cache, const void *object, · 33 unmodified lines |
| 448 | tag = assign_tag(cache, object, false, keep_tag); | 453 | tag = assign_tag(cache, object, false, keep_tag); |
| 449 | | 454 | |
| 450 | /* Tag is ignored in set_tag without CONFIG_KASAN_SW_TAGS */ | 455 | /* Tag is ignored in set_tag without CONFIG_KASAN_SW_TAGS */ |
| 451 | kasan_unpoison_shadow(set_tag(object, tag), size); | 456 | unpoison_range(set_tag(object, tag), size); |
| 452 | kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start, | 457 | poison_range((void *)redzone_start, redzone_end - redzone_start, |
| 453 | KASAN_KMALLOC_REDZONE); | 458 | KASAN_KMALLOC_REDZONE); |
| 454 | | 459 | |
| 455 | if (cache->flags & SLAB_KASAN) | 460 | if (cache->flags & SLAB_KASAN) |
| 456 | kasan_set_track(&get_alloc_info(cache, object)->alloc_track, flags); | 461 | kasan_set_track(&get_alloc_info(cache, object)->alloc_track, flags); |
| @@ -489,9 +494,9 @@ void * __must_check kasan_kmalloc_large(const void *ptr, size_t size, · 32 unmodified lines |
| 489 | KASAN_SHADOW_SCALE_SIZE); | 494 | KASAN_SHADOW_SCALE_SIZE); |
| 490 | redzone_end = (unsigned long)ptr + page_size(page); | 495 | redzone_end = (unsigned long)ptr + page_size(page); |
| 491 | | 496 | |
| 492 | kasan_unpoison_shadow(ptr, size); | 497 | unpoison_range(ptr, size); |
| 493 | kasan_poison_shadow((void *)redzone_start, redzone_end - redzone_start, | 498 | poison_range((void *)redzone_start, redzone_end - redzone_start, |
| 494 | KASAN_PAGE_REDZONE); | 499 | KASAN_PAGE_REDZONE); |
| 495 | | 500 | |
| 496 | return (void *)ptr; | 501 | return (void *)ptr; |
| 497 | } | 502 | } |
| @@ -523,7 +528,7 @@ void kasan_poison_kfree(void *ptr, unsigned long ip) · 25 unmodified lines |
| 523 | kasan_report_invalid_free(ptr, ip); | 528 | kasan_report_invalid_free(ptr, ip); |
| 524 | return; | 529 | return; |
| 525 | } | 530 | } |
| 526 | kasan_poison_shadow(ptr, page_size(page), KASAN_FREE_PAGE); | 531 | poison_range(ptr, page_size(page), KASAN_FREE_PAGE); |
| 527 | } else { | 532 | } else { |
| 528 | __kasan_slab_free(page->slab_cache, ptr, ip, false); | 533 | __kasan_slab_free(page->slab_cache, ptr, ip, false); |
| 529 | } | 534 | } |
| @@ -709,7 +714,7 @@ int kasan_populate_vmalloc(unsigned long addr, unsigned long size) · 179 unmodified lines |
| 709 | * // vmalloc() allocates memory | 714 | * // vmalloc() allocates memory |
| 710 | * // let a = area->addr | 715 | * // let a = area->addr |
| 711 | * // we reach kasan_populate_vmalloc | 716 | * // we reach kasan_populate_vmalloc |
| 712 | * // and call kasan_unpoison_shadow: | 717 | * // and call unpoison_range: |
| 713 | * STORE shadow(a), unpoison_val | 718 | * STORE shadow(a), unpoison_val |
| 714 | * ... | 719 | * ... |
| 715 | * STORE shadow(a+99), unpoison_val x = LOAD p | 720 | * STORE shadow(a+99), unpoison_val x = LOAD p |
| @@ -744,7 +749,7 @@ void kasan_poison_vmalloc(const void *start, unsigned long size) · 28 unmodified lines |
| 744 | return; | 749 | return; |
| 745 | | 750 | |
| 746 | size = round_up(size, KASAN_SHADOW_SCALE_SIZE); | 751 | size = round_up(size, KASAN_SHADOW_SCALE_SIZE); |
| 747 | kasan_poison_shadow(start, size, KASAN_VMALLOC_INVALID); | 752 | poison_range(start, size, KASAN_VMALLOC_INVALID); |
| 748 | } | 753 | } |
| 749 | | 754 | |
| 750 | void kasan_unpoison_vmalloc(const void *start, unsigned long size) | 755 | void kasan_unpoison_vmalloc(const void *start, unsigned long size) |
| @@ -752,7 +757,7 @@ void kasan_unpoison_vmalloc(const void *start, unsigned long size) · 1 unmodified line |
| 752 | if (!is_vmalloc_or_module_addr(start)) | 757 | if (!is_vmalloc_or_module_addr(start)) |
| 753 | return; | 758 | return; |
| 754 | | 759 | |
| 755 | kasan_unpoison_shadow(start, size); | 760 | unpoison_range(start, size); |
| 756 | } | 761 | } |
| 757 | | 762 | |
| 758 | static int kasan_depopulate_vmalloc_pte(pte_t *ptep, unsigned long addr, | 763 | static int kasan_depopulate_vmalloc_pte(pte_t *ptep, unsigned long addr, |