diff options
Diffstat (limited to 'lib/test_kasan.c')
| -rw-r--r-- | lib/test_kasan.c | 35 | 
1 files changed, 33 insertions, 2 deletions
| diff --git a/lib/test_kasan.c b/lib/test_kasan.c index 0643573f8686..26a5c9007653 100644 --- a/lib/test_kasan.c +++ b/lib/test_kasan.c @@ -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); @@ -700,7 +703,7 @@ static void kmem_cache_bulk(struct kunit *test)  static char global_array[10]; -static void kasan_global_oob(struct kunit *test) +static void kasan_global_oob_right(struct kunit *test)  {  	/*  	 * Deliberate out-of-bounds access. To prevent CONFIG_UBSAN_LOCAL_BOUNDS @@ -723,6 +726,20 @@ static void kasan_global_oob(struct kunit *test)  	KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);  } +static void kasan_global_oob_left(struct kunit *test) +{ +	char *volatile array = global_array; +	char *p = array - 3; + +	/* +	 * GCC is known to fail this test, skip it. +	 * See https://bugzilla.kernel.org/show_bug.cgi?id=215051. +	 */ +	KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_CC_IS_CLANG); +	KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC); +	KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p); +} +  /* Check that ksize() makes the whole object accessible. */  static void ksize_unpoisons_memory(struct kunit *test)  { @@ -852,6 +869,16 @@ static void kmem_cache_invalid_free(struct kunit *test)  	kmem_cache_destroy(cache);  } +static void kmem_cache_double_destroy(struct kunit *test) +{ +	struct kmem_cache *cache; + +	cache = kmem_cache_create("test_cache", 200, 0, 0, NULL); +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache); +	kmem_cache_destroy(cache); +	KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_destroy(cache)); +} +  static void kasan_memchr(struct kunit *test)  {  	char *ptr; @@ -869,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)); @@ -895,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)); @@ -1162,7 +1191,8 @@ static struct kunit_case kasan_kunit_test_cases[] = {  	KUNIT_CASE(kmem_cache_oob),  	KUNIT_CASE(kmem_cache_accounted),  	KUNIT_CASE(kmem_cache_bulk), -	KUNIT_CASE(kasan_global_oob), +	KUNIT_CASE(kasan_global_oob_right), +	KUNIT_CASE(kasan_global_oob_left),  	KUNIT_CASE(kasan_stack_oob),  	KUNIT_CASE(kasan_alloca_oob_left),  	KUNIT_CASE(kasan_alloca_oob_right), @@ -1170,6 +1200,7 @@ static struct kunit_case kasan_kunit_test_cases[] = {  	KUNIT_CASE(ksize_uaf),  	KUNIT_CASE(kmem_cache_double_free),  	KUNIT_CASE(kmem_cache_invalid_free), +	KUNIT_CASE(kmem_cache_double_destroy),  	KUNIT_CASE(kasan_memchr),  	KUNIT_CASE(kasan_memcmp),  	KUNIT_CASE(kasan_strings), |