162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Runtime test cases for CONFIG_FORTIFY_SOURCE that aren't expected to 462306a36Sopenharmony_ci * Oops the kernel on success. (For those, see drivers/misc/lkdtm/fortify.c) 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * For corner cases with UBSAN, try testing with: 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * ./tools/testing/kunit/kunit.py run --arch=x86_64 \ 962306a36Sopenharmony_ci * --kconfig_add CONFIG_FORTIFY_SOURCE=y \ 1062306a36Sopenharmony_ci * --kconfig_add CONFIG_UBSAN=y \ 1162306a36Sopenharmony_ci * --kconfig_add CONFIG_UBSAN_TRAP=y \ 1262306a36Sopenharmony_ci * --kconfig_add CONFIG_UBSAN_BOUNDS=y \ 1362306a36Sopenharmony_ci * --kconfig_add CONFIG_UBSAN_LOCAL_BOUNDS=y \ 1462306a36Sopenharmony_ci * --make_options LLVM=1 fortify 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <kunit/test.h> 1962306a36Sopenharmony_ci#include <linux/device.h> 2062306a36Sopenharmony_ci#include <linux/slab.h> 2162306a36Sopenharmony_ci#include <linux/string.h> 2262306a36Sopenharmony_ci#include <linux/vmalloc.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic const char array_of_10[] = "this is 10"; 2562306a36Sopenharmony_cistatic const char *ptr_of_11 = "this is 11!"; 2662306a36Sopenharmony_cistatic char array_unknown[] = "compiler thinks I might change"; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic void known_sizes_test(struct kunit *test) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, __compiletime_strlen("88888888"), 8); 3162306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, __compiletime_strlen(array_of_10), 10); 3262306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, __compiletime_strlen(ptr_of_11), 11); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, __compiletime_strlen(array_unknown), SIZE_MAX); 3562306a36Sopenharmony_ci /* Externally defined and dynamically sized string pointer: */ 3662306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, __compiletime_strlen(test->name), SIZE_MAX); 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* This is volatile so the optimizer can't perform DCE below. */ 4062306a36Sopenharmony_cistatic volatile int pick; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* Not inline to keep optimizer from figuring out which string we want. */ 4362306a36Sopenharmony_cistatic noinline size_t want_minus_one(int pick) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci const char *str; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci switch (pick) { 4862306a36Sopenharmony_ci case 1: 4962306a36Sopenharmony_ci str = "4444"; 5062306a36Sopenharmony_ci break; 5162306a36Sopenharmony_ci case 2: 5262306a36Sopenharmony_ci str = "333"; 5362306a36Sopenharmony_ci break; 5462306a36Sopenharmony_ci default: 5562306a36Sopenharmony_ci str = "1"; 5662306a36Sopenharmony_ci break; 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci return __compiletime_strlen(str); 5962306a36Sopenharmony_ci} 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistatic void control_flow_split_test(struct kunit *test) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, want_minus_one(pick), SIZE_MAX); 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define KUNIT_EXPECT_BOS(test, p, expected, name) \ 6762306a36Sopenharmony_ci KUNIT_EXPECT_EQ_MSG(test, __builtin_object_size(p, 1), \ 6862306a36Sopenharmony_ci expected, \ 6962306a36Sopenharmony_ci "__alloc_size() not working with __bos on " name "\n") 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#if !__has_builtin(__builtin_dynamic_object_size) 7262306a36Sopenharmony_ci#define KUNIT_EXPECT_BDOS(test, p, expected, name) \ 7362306a36Sopenharmony_ci /* Silence "unused variable 'expected'" warning. */ \ 7462306a36Sopenharmony_ci KUNIT_EXPECT_EQ(test, expected, expected) 7562306a36Sopenharmony_ci#else 7662306a36Sopenharmony_ci#define KUNIT_EXPECT_BDOS(test, p, expected, name) \ 7762306a36Sopenharmony_ci KUNIT_EXPECT_EQ_MSG(test, __builtin_dynamic_object_size(p, 1), \ 7862306a36Sopenharmony_ci expected, \ 7962306a36Sopenharmony_ci "__alloc_size() not working with __bdos on " name "\n") 8062306a36Sopenharmony_ci#endif 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* If the execpted size is a constant value, __bos can see it. */ 8362306a36Sopenharmony_ci#define check_const(_expected, alloc, free) do { \ 8462306a36Sopenharmony_ci size_t expected = (_expected); \ 8562306a36Sopenharmony_ci void *p = alloc; \ 8662306a36Sopenharmony_ci KUNIT_EXPECT_TRUE_MSG(test, p != NULL, #alloc " failed?!\n"); \ 8762306a36Sopenharmony_ci KUNIT_EXPECT_BOS(test, p, expected, #alloc); \ 8862306a36Sopenharmony_ci KUNIT_EXPECT_BDOS(test, p, expected, #alloc); \ 8962306a36Sopenharmony_ci free; \ 9062306a36Sopenharmony_ci} while (0) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* If the execpted size is NOT a constant value, __bos CANNOT see it. */ 9362306a36Sopenharmony_ci#define check_dynamic(_expected, alloc, free) do { \ 9462306a36Sopenharmony_ci size_t expected = (_expected); \ 9562306a36Sopenharmony_ci void *p = alloc; \ 9662306a36Sopenharmony_ci KUNIT_EXPECT_TRUE_MSG(test, p != NULL, #alloc " failed?!\n"); \ 9762306a36Sopenharmony_ci KUNIT_EXPECT_BOS(test, p, SIZE_MAX, #alloc); \ 9862306a36Sopenharmony_ci KUNIT_EXPECT_BDOS(test, p, expected, #alloc); \ 9962306a36Sopenharmony_ci free; \ 10062306a36Sopenharmony_ci} while (0) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Assortment of constant-value kinda-edge cases. */ 10362306a36Sopenharmony_ci#define CONST_TEST_BODY(TEST_alloc) do { \ 10462306a36Sopenharmony_ci /* Special-case vmalloc()-family to skip 0-sized allocs. */ \ 10562306a36Sopenharmony_ci if (strcmp(#TEST_alloc, "TEST_vmalloc") != 0) \ 10662306a36Sopenharmony_ci TEST_alloc(check_const, 0, 0); \ 10762306a36Sopenharmony_ci TEST_alloc(check_const, 1, 1); \ 10862306a36Sopenharmony_ci TEST_alloc(check_const, 128, 128); \ 10962306a36Sopenharmony_ci TEST_alloc(check_const, 1023, 1023); \ 11062306a36Sopenharmony_ci TEST_alloc(check_const, 1025, 1025); \ 11162306a36Sopenharmony_ci TEST_alloc(check_const, 4096, 4096); \ 11262306a36Sopenharmony_ci TEST_alloc(check_const, 4097, 4097); \ 11362306a36Sopenharmony_ci} while (0) 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic volatile size_t zero_size; 11662306a36Sopenharmony_cistatic volatile size_t unknown_size = 50; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#if !__has_builtin(__builtin_dynamic_object_size) 11962306a36Sopenharmony_ci#define DYNAMIC_TEST_BODY(TEST_alloc) \ 12062306a36Sopenharmony_ci kunit_skip(test, "Compiler is missing __builtin_dynamic_object_size() support\n") 12162306a36Sopenharmony_ci#else 12262306a36Sopenharmony_ci#define DYNAMIC_TEST_BODY(TEST_alloc) do { \ 12362306a36Sopenharmony_ci size_t size = unknown_size; \ 12462306a36Sopenharmony_ci \ 12562306a36Sopenharmony_ci /* \ 12662306a36Sopenharmony_ci * Expected size is "size" in each test, before it is then \ 12762306a36Sopenharmony_ci * internally incremented in each test. Requires we disable \ 12862306a36Sopenharmony_ci * -Wunsequenced. \ 12962306a36Sopenharmony_ci */ \ 13062306a36Sopenharmony_ci TEST_alloc(check_dynamic, size, size++); \ 13162306a36Sopenharmony_ci /* Make sure incrementing actually happened. */ \ 13262306a36Sopenharmony_ci KUNIT_EXPECT_NE(test, size, unknown_size); \ 13362306a36Sopenharmony_ci} while (0) 13462306a36Sopenharmony_ci#endif 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define DEFINE_ALLOC_SIZE_TEST_PAIR(allocator) \ 13762306a36Sopenharmony_cistatic void alloc_size_##allocator##_const_test(struct kunit *test) \ 13862306a36Sopenharmony_ci{ \ 13962306a36Sopenharmony_ci CONST_TEST_BODY(TEST_##allocator); \ 14062306a36Sopenharmony_ci} \ 14162306a36Sopenharmony_cistatic void alloc_size_##allocator##_dynamic_test(struct kunit *test) \ 14262306a36Sopenharmony_ci{ \ 14362306a36Sopenharmony_ci DYNAMIC_TEST_BODY(TEST_##allocator); \ 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define TEST_kmalloc(checker, expected_size, alloc_size) do { \ 14762306a36Sopenharmony_ci gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; \ 14862306a36Sopenharmony_ci void *orig; \ 14962306a36Sopenharmony_ci size_t len; \ 15062306a36Sopenharmony_ci \ 15162306a36Sopenharmony_ci checker(expected_size, kmalloc(alloc_size, gfp), \ 15262306a36Sopenharmony_ci kfree(p)); \ 15362306a36Sopenharmony_ci checker(expected_size, \ 15462306a36Sopenharmony_ci kmalloc_node(alloc_size, gfp, NUMA_NO_NODE), \ 15562306a36Sopenharmony_ci kfree(p)); \ 15662306a36Sopenharmony_ci checker(expected_size, kzalloc(alloc_size, gfp), \ 15762306a36Sopenharmony_ci kfree(p)); \ 15862306a36Sopenharmony_ci checker(expected_size, \ 15962306a36Sopenharmony_ci kzalloc_node(alloc_size, gfp, NUMA_NO_NODE), \ 16062306a36Sopenharmony_ci kfree(p)); \ 16162306a36Sopenharmony_ci checker(expected_size, kcalloc(1, alloc_size, gfp), \ 16262306a36Sopenharmony_ci kfree(p)); \ 16362306a36Sopenharmony_ci checker(expected_size, kcalloc(alloc_size, 1, gfp), \ 16462306a36Sopenharmony_ci kfree(p)); \ 16562306a36Sopenharmony_ci checker(expected_size, \ 16662306a36Sopenharmony_ci kcalloc_node(1, alloc_size, gfp, NUMA_NO_NODE), \ 16762306a36Sopenharmony_ci kfree(p)); \ 16862306a36Sopenharmony_ci checker(expected_size, \ 16962306a36Sopenharmony_ci kcalloc_node(alloc_size, 1, gfp, NUMA_NO_NODE), \ 17062306a36Sopenharmony_ci kfree(p)); \ 17162306a36Sopenharmony_ci checker(expected_size, kmalloc_array(1, alloc_size, gfp), \ 17262306a36Sopenharmony_ci kfree(p)); \ 17362306a36Sopenharmony_ci checker(expected_size, kmalloc_array(alloc_size, 1, gfp), \ 17462306a36Sopenharmony_ci kfree(p)); \ 17562306a36Sopenharmony_ci checker(expected_size, \ 17662306a36Sopenharmony_ci kmalloc_array_node(1, alloc_size, gfp, NUMA_NO_NODE), \ 17762306a36Sopenharmony_ci kfree(p)); \ 17862306a36Sopenharmony_ci checker(expected_size, \ 17962306a36Sopenharmony_ci kmalloc_array_node(alloc_size, 1, gfp, NUMA_NO_NODE), \ 18062306a36Sopenharmony_ci kfree(p)); \ 18162306a36Sopenharmony_ci checker(expected_size, __kmalloc(alloc_size, gfp), \ 18262306a36Sopenharmony_ci kfree(p)); \ 18362306a36Sopenharmony_ci checker(expected_size, \ 18462306a36Sopenharmony_ci __kmalloc_node(alloc_size, gfp, NUMA_NO_NODE), \ 18562306a36Sopenharmony_ci kfree(p)); \ 18662306a36Sopenharmony_ci \ 18762306a36Sopenharmony_ci orig = kmalloc(alloc_size, gfp); \ 18862306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, orig != NULL); \ 18962306a36Sopenharmony_ci checker((expected_size) * 2, \ 19062306a36Sopenharmony_ci krealloc(orig, (alloc_size) * 2, gfp), \ 19162306a36Sopenharmony_ci kfree(p)); \ 19262306a36Sopenharmony_ci orig = kmalloc(alloc_size, gfp); \ 19362306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, orig != NULL); \ 19462306a36Sopenharmony_ci checker((expected_size) * 2, \ 19562306a36Sopenharmony_ci krealloc_array(orig, 1, (alloc_size) * 2, gfp), \ 19662306a36Sopenharmony_ci kfree(p)); \ 19762306a36Sopenharmony_ci orig = kmalloc(alloc_size, gfp); \ 19862306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, orig != NULL); \ 19962306a36Sopenharmony_ci checker((expected_size) * 2, \ 20062306a36Sopenharmony_ci krealloc_array(orig, (alloc_size) * 2, 1, gfp), \ 20162306a36Sopenharmony_ci kfree(p)); \ 20262306a36Sopenharmony_ci \ 20362306a36Sopenharmony_ci len = 11; \ 20462306a36Sopenharmony_ci /* Using memdup() with fixed size, so force unknown length. */ \ 20562306a36Sopenharmony_ci if (!__builtin_constant_p(expected_size)) \ 20662306a36Sopenharmony_ci len += zero_size; \ 20762306a36Sopenharmony_ci checker(len, kmemdup("hello there", len, gfp), kfree(p)); \ 20862306a36Sopenharmony_ci} while (0) 20962306a36Sopenharmony_ciDEFINE_ALLOC_SIZE_TEST_PAIR(kmalloc) 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/* Sizes are in pages, not bytes. */ 21262306a36Sopenharmony_ci#define TEST_vmalloc(checker, expected_pages, alloc_pages) do { \ 21362306a36Sopenharmony_ci gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; \ 21462306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 21562306a36Sopenharmony_ci vmalloc((alloc_pages) * PAGE_SIZE), vfree(p)); \ 21662306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 21762306a36Sopenharmony_ci vzalloc((alloc_pages) * PAGE_SIZE), vfree(p)); \ 21862306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 21962306a36Sopenharmony_ci __vmalloc((alloc_pages) * PAGE_SIZE, gfp), vfree(p)); \ 22062306a36Sopenharmony_ci} while (0) 22162306a36Sopenharmony_ciDEFINE_ALLOC_SIZE_TEST_PAIR(vmalloc) 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci/* Sizes are in pages (and open-coded for side-effects), not bytes. */ 22462306a36Sopenharmony_ci#define TEST_kvmalloc(checker, expected_pages, alloc_pages) do { \ 22562306a36Sopenharmony_ci gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; \ 22662306a36Sopenharmony_ci size_t prev_size; \ 22762306a36Sopenharmony_ci void *orig; \ 22862306a36Sopenharmony_ci \ 22962306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 23062306a36Sopenharmony_ci kvmalloc((alloc_pages) * PAGE_SIZE, gfp), \ 23162306a36Sopenharmony_ci vfree(p)); \ 23262306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 23362306a36Sopenharmony_ci kvmalloc_node((alloc_pages) * PAGE_SIZE, gfp, NUMA_NO_NODE), \ 23462306a36Sopenharmony_ci vfree(p)); \ 23562306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 23662306a36Sopenharmony_ci kvzalloc((alloc_pages) * PAGE_SIZE, gfp), \ 23762306a36Sopenharmony_ci vfree(p)); \ 23862306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 23962306a36Sopenharmony_ci kvzalloc_node((alloc_pages) * PAGE_SIZE, gfp, NUMA_NO_NODE), \ 24062306a36Sopenharmony_ci vfree(p)); \ 24162306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 24262306a36Sopenharmony_ci kvcalloc(1, (alloc_pages) * PAGE_SIZE, gfp), \ 24362306a36Sopenharmony_ci vfree(p)); \ 24462306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 24562306a36Sopenharmony_ci kvcalloc((alloc_pages) * PAGE_SIZE, 1, gfp), \ 24662306a36Sopenharmony_ci vfree(p)); \ 24762306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 24862306a36Sopenharmony_ci kvmalloc_array(1, (alloc_pages) * PAGE_SIZE, gfp), \ 24962306a36Sopenharmony_ci vfree(p)); \ 25062306a36Sopenharmony_ci checker((expected_pages) * PAGE_SIZE, \ 25162306a36Sopenharmony_ci kvmalloc_array((alloc_pages) * PAGE_SIZE, 1, gfp), \ 25262306a36Sopenharmony_ci vfree(p)); \ 25362306a36Sopenharmony_ci \ 25462306a36Sopenharmony_ci prev_size = (expected_pages) * PAGE_SIZE; \ 25562306a36Sopenharmony_ci orig = kvmalloc(prev_size, gfp); \ 25662306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, orig != NULL); \ 25762306a36Sopenharmony_ci checker(((expected_pages) * PAGE_SIZE) * 2, \ 25862306a36Sopenharmony_ci kvrealloc(orig, prev_size, \ 25962306a36Sopenharmony_ci ((alloc_pages) * PAGE_SIZE) * 2, gfp), \ 26062306a36Sopenharmony_ci kvfree(p)); \ 26162306a36Sopenharmony_ci} while (0) 26262306a36Sopenharmony_ciDEFINE_ALLOC_SIZE_TEST_PAIR(kvmalloc) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci#define TEST_devm_kmalloc(checker, expected_size, alloc_size) do { \ 26562306a36Sopenharmony_ci gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; \ 26662306a36Sopenharmony_ci const char dev_name[] = "fortify-test"; \ 26762306a36Sopenharmony_ci struct device *dev; \ 26862306a36Sopenharmony_ci void *orig; \ 26962306a36Sopenharmony_ci size_t len; \ 27062306a36Sopenharmony_ci \ 27162306a36Sopenharmony_ci /* Create dummy device for devm_kmalloc()-family tests. */ \ 27262306a36Sopenharmony_ci dev = root_device_register(dev_name); \ 27362306a36Sopenharmony_ci KUNIT_ASSERT_FALSE_MSG(test, IS_ERR(dev), \ 27462306a36Sopenharmony_ci "Cannot register test device\n"); \ 27562306a36Sopenharmony_ci \ 27662306a36Sopenharmony_ci checker(expected_size, devm_kmalloc(dev, alloc_size, gfp), \ 27762306a36Sopenharmony_ci devm_kfree(dev, p)); \ 27862306a36Sopenharmony_ci checker(expected_size, devm_kzalloc(dev, alloc_size, gfp), \ 27962306a36Sopenharmony_ci devm_kfree(dev, p)); \ 28062306a36Sopenharmony_ci checker(expected_size, \ 28162306a36Sopenharmony_ci devm_kmalloc_array(dev, 1, alloc_size, gfp), \ 28262306a36Sopenharmony_ci devm_kfree(dev, p)); \ 28362306a36Sopenharmony_ci checker(expected_size, \ 28462306a36Sopenharmony_ci devm_kmalloc_array(dev, alloc_size, 1, gfp), \ 28562306a36Sopenharmony_ci devm_kfree(dev, p)); \ 28662306a36Sopenharmony_ci checker(expected_size, \ 28762306a36Sopenharmony_ci devm_kcalloc(dev, 1, alloc_size, gfp), \ 28862306a36Sopenharmony_ci devm_kfree(dev, p)); \ 28962306a36Sopenharmony_ci checker(expected_size, \ 29062306a36Sopenharmony_ci devm_kcalloc(dev, alloc_size, 1, gfp), \ 29162306a36Sopenharmony_ci devm_kfree(dev, p)); \ 29262306a36Sopenharmony_ci \ 29362306a36Sopenharmony_ci orig = devm_kmalloc(dev, alloc_size, gfp); \ 29462306a36Sopenharmony_ci KUNIT_EXPECT_TRUE(test, orig != NULL); \ 29562306a36Sopenharmony_ci checker((expected_size) * 2, \ 29662306a36Sopenharmony_ci devm_krealloc(dev, orig, (alloc_size) * 2, gfp), \ 29762306a36Sopenharmony_ci devm_kfree(dev, p)); \ 29862306a36Sopenharmony_ci \ 29962306a36Sopenharmony_ci len = 4; \ 30062306a36Sopenharmony_ci /* Using memdup() with fixed size, so force unknown length. */ \ 30162306a36Sopenharmony_ci if (!__builtin_constant_p(expected_size)) \ 30262306a36Sopenharmony_ci len += zero_size; \ 30362306a36Sopenharmony_ci checker(len, devm_kmemdup(dev, "Ohai", len, gfp), \ 30462306a36Sopenharmony_ci devm_kfree(dev, p)); \ 30562306a36Sopenharmony_ci \ 30662306a36Sopenharmony_ci device_unregister(dev); \ 30762306a36Sopenharmony_ci} while (0) 30862306a36Sopenharmony_ciDEFINE_ALLOC_SIZE_TEST_PAIR(devm_kmalloc) 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic struct kunit_case fortify_test_cases[] = { 31162306a36Sopenharmony_ci KUNIT_CASE(known_sizes_test), 31262306a36Sopenharmony_ci KUNIT_CASE(control_flow_split_test), 31362306a36Sopenharmony_ci KUNIT_CASE(alloc_size_kmalloc_const_test), 31462306a36Sopenharmony_ci KUNIT_CASE(alloc_size_kmalloc_dynamic_test), 31562306a36Sopenharmony_ci KUNIT_CASE(alloc_size_vmalloc_const_test), 31662306a36Sopenharmony_ci KUNIT_CASE(alloc_size_vmalloc_dynamic_test), 31762306a36Sopenharmony_ci KUNIT_CASE(alloc_size_kvmalloc_const_test), 31862306a36Sopenharmony_ci KUNIT_CASE(alloc_size_kvmalloc_dynamic_test), 31962306a36Sopenharmony_ci KUNIT_CASE(alloc_size_devm_kmalloc_const_test), 32062306a36Sopenharmony_ci KUNIT_CASE(alloc_size_devm_kmalloc_dynamic_test), 32162306a36Sopenharmony_ci {} 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic struct kunit_suite fortify_test_suite = { 32562306a36Sopenharmony_ci .name = "fortify", 32662306a36Sopenharmony_ci .test_cases = fortify_test_cases, 32762306a36Sopenharmony_ci}; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cikunit_test_suite(fortify_test_suite); 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 332