kasan: test: fix compatibility with FORTIFY_SOURCE
With CONFIG_FORTIFY_SOURCE enabled, string functions will also perform dynamic checks using __builtin_object_size(ptr), which when failed will panic the kernel. Because the KASAN test deliberately performs out-of-bounds operations, the kernel panics with FORTIFY_SOURCE, for example: | kernel BUG at lib/string_helpers.c:910! | invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI | CPU: 1 PID: 137 Comm: kunit_try_catch Tainted: G B 5.16.0-rc3+ #3 | Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 | RIP: 0010:fortify_panic+0x19/0x1b | ... | Call Trace: | kmalloc_oob_in_memset.cold+0x16/0x16 | ... Fix it by also hiding `ptr` from the optimizer, which will ensure that __builtin_object_size() does not return a valid size, preventing fortified string functions from panicking. Link: https://lkml.kernel.org/r/20220124160744.1244685-1-elver@google.com Signed-off-by: Marco Elver <elver@google.com> Reported-by: Nico Pache <npache@redhat.com> Reviewed-by: Nico Pache <npache@redhat.com> Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com> Cc: Alexander Potapenko <glider@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									0226bd64da
								
							
						
					
					
						commit
						09c6304e38
					
				| @ -492,6 +492,7 @@ static void kmalloc_oob_in_memset(struct kunit *test) | ||||
| 	ptr = kmalloc(size, GFP_KERNEL); | ||||
| 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); | ||||
| 
 | ||||
| 	OPTIMIZER_HIDE_VAR(ptr); | ||||
| 	OPTIMIZER_HIDE_VAR(size); | ||||
| 	KUNIT_EXPECT_KASAN_FAIL(test, | ||||
| 				memset(ptr, 0, size + KASAN_GRANULE_SIZE)); | ||||
| @ -515,6 +516,7 @@ static void kmalloc_memmove_negative_size(struct kunit *test) | ||||
| 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); | ||||
| 
 | ||||
| 	memset((char *)ptr, 0, 64); | ||||
| 	OPTIMIZER_HIDE_VAR(ptr); | ||||
| 	OPTIMIZER_HIDE_VAR(invalid_size); | ||||
| 	KUNIT_EXPECT_KASAN_FAIL(test, | ||||
| 		memmove((char *)ptr, (char *)ptr + 4, invalid_size)); | ||||
| @ -531,6 +533,7 @@ static void kmalloc_memmove_invalid_size(struct kunit *test) | ||||
| 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); | ||||
| 
 | ||||
| 	memset((char *)ptr, 0, 64); | ||||
| 	OPTIMIZER_HIDE_VAR(ptr); | ||||
| 	KUNIT_EXPECT_KASAN_FAIL(test, | ||||
| 		memmove((char *)ptr, (char *)ptr + 4, invalid_size)); | ||||
| 	kfree(ptr); | ||||
| @ -893,6 +896,7 @@ static void kasan_memchr(struct kunit *test) | ||||
| 	ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO); | ||||
| 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); | ||||
| 
 | ||||
| 	OPTIMIZER_HIDE_VAR(ptr); | ||||
| 	OPTIMIZER_HIDE_VAR(size); | ||||
| 	KUNIT_EXPECT_KASAN_FAIL(test, | ||||
| 		kasan_ptr_result = memchr(ptr, '1', size + 1)); | ||||
| @ -919,6 +923,7 @@ static void kasan_memcmp(struct kunit *test) | ||||
| 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); | ||||
| 	memset(arr, 0, sizeof(arr)); | ||||
| 
 | ||||
| 	OPTIMIZER_HIDE_VAR(ptr); | ||||
| 	OPTIMIZER_HIDE_VAR(size); | ||||
| 	KUNIT_EXPECT_KASAN_FAIL(test, | ||||
| 		kasan_int_result = memcmp(ptr, arr, size+1)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user