~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/mm/kasan/kasan_test_c.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  *
  4  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  5  * Author: Andrey Ryabinin <a.ryabinin@samsung.com>
  6  */
  7 
  8 #define pr_fmt(fmt) "kasan: test: " fmt
  9 
 10 #include <kunit/test.h>
 11 #include <linux/bitops.h>
 12 #include <linux/delay.h>
 13 #include <linux/io.h>
 14 #include <linux/kasan.h>
 15 #include <linux/kernel.h>
 16 #include <linux/mempool.h>
 17 #include <linux/mm.h>
 18 #include <linux/mman.h>
 19 #include <linux/module.h>
 20 #include <linux/printk.h>
 21 #include <linux/random.h>
 22 #include <linux/set_memory.h>
 23 #include <linux/slab.h>
 24 #include <linux/string.h>
 25 #include <linux/tracepoint.h>
 26 #include <linux/uaccess.h>
 27 #include <linux/vmalloc.h>
 28 #include <trace/events/printk.h>
 29 
 30 #include <asm/page.h>
 31 
 32 #include "kasan.h"
 33 
 34 #define OOB_TAG_OFF (IS_ENABLED(CONFIG_KASAN_GENERIC) ? 0 : KASAN_GRANULE_SIZE)
 35 
 36 static bool multishot;
 37 
 38 /* Fields set based on lines observed in the console. */
 39 static struct {
 40         bool report_found;
 41         bool async_fault;
 42 } test_status;
 43 
 44 /*
 45  * Some tests use these global variables to store return values from function
 46  * calls that could otherwise be eliminated by the compiler as dead code.
 47  */
 48 void *kasan_ptr_result;
 49 int kasan_int_result;
 50 
 51 /* Probe for console output: obtains test_status lines of interest. */
 52 static void probe_console(void *ignore, const char *buf, size_t len)
 53 {
 54         if (strnstr(buf, "BUG: KASAN: ", len))
 55                 WRITE_ONCE(test_status.report_found, true);
 56         else if (strnstr(buf, "Asynchronous fault: ", len))
 57                 WRITE_ONCE(test_status.async_fault, true);
 58 }
 59 
 60 static int kasan_suite_init(struct kunit_suite *suite)
 61 {
 62         if (!kasan_enabled()) {
 63                 pr_err("Can't run KASAN tests with KASAN disabled");
 64                 return -1;
 65         }
 66 
 67         /* Stop failing KUnit tests on KASAN reports. */
 68         kasan_kunit_test_suite_start();
 69 
 70         /*
 71          * Temporarily enable multi-shot mode. Otherwise, KASAN would only
 72          * report the first detected bug and panic the kernel if panic_on_warn
 73          * is enabled.
 74          */
 75         multishot = kasan_save_enable_multi_shot();
 76 
 77         register_trace_console(probe_console, NULL);
 78         return 0;
 79 }
 80 
 81 static void kasan_suite_exit(struct kunit_suite *suite)
 82 {
 83         kasan_kunit_test_suite_end();
 84         kasan_restore_multi_shot(multishot);
 85         unregister_trace_console(probe_console, NULL);
 86         tracepoint_synchronize_unregister();
 87 }
 88 
 89 static void kasan_test_exit(struct kunit *test)
 90 {
 91         KUNIT_EXPECT_FALSE(test, READ_ONCE(test_status.report_found));
 92 }
 93 
 94 /**
 95  * KUNIT_EXPECT_KASAN_FAIL - check that the executed expression produces a
 96  * KASAN report; causes a KUnit test failure otherwise.
 97  *
 98  * @test: Currently executing KUnit test.
 99  * @expression: Expression that must produce a KASAN report.
100  *
101  * For hardware tag-based KASAN, when a synchronous tag fault happens, tag
102  * checking is auto-disabled. When this happens, this test handler reenables
103  * tag checking. As tag checking can be only disabled or enabled per CPU,
104  * this handler disables migration (preemption).
105  *
106  * Since the compiler doesn't see that the expression can change the test_status
107  * fields, it can reorder or optimize away the accesses to those fields.
108  * Use READ/WRITE_ONCE() for the accesses and compiler barriers around the
109  * expression to prevent that.
110  *
111  * In between KUNIT_EXPECT_KASAN_FAIL checks, test_status.report_found is kept
112  * as false. This allows detecting KASAN reports that happen outside of the
113  * checks by asserting !test_status.report_found at the start of
114  * KUNIT_EXPECT_KASAN_FAIL and in kasan_test_exit.
115  */
116 #define KUNIT_EXPECT_KASAN_FAIL(test, expression) do {                  \
117         if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) &&                         \
118             kasan_sync_fault_possible())                                \
119                 migrate_disable();                                      \
120         KUNIT_EXPECT_FALSE(test, READ_ONCE(test_status.report_found));  \
121         barrier();                                                      \
122         expression;                                                     \
123         barrier();                                                      \
124         if (kasan_async_fault_possible())                               \
125                 kasan_force_async_fault();                              \
126         if (!READ_ONCE(test_status.report_found)) {                     \
127                 KUNIT_FAIL(test, KUNIT_SUBTEST_INDENT "KASAN failure "  \
128                                 "expected in \"" #expression            \
129                                  "\", but none occurred");              \
130         }                                                               \
131         if (IS_ENABLED(CONFIG_KASAN_HW_TAGS) &&                         \
132             kasan_sync_fault_possible()) {                              \
133                 if (READ_ONCE(test_status.report_found) &&              \
134                     !READ_ONCE(test_status.async_fault))                \
135                         kasan_enable_hw_tags();                         \
136                 migrate_enable();                                       \
137         }                                                               \
138         WRITE_ONCE(test_status.report_found, false);                    \
139         WRITE_ONCE(test_status.async_fault, false);                     \
140 } while (0)
141 
142 #define KASAN_TEST_NEEDS_CONFIG_ON(test, config) do {                   \
143         if (!IS_ENABLED(config))                                        \
144                 kunit_skip((test), "Test requires " #config "=y");      \
145 } while (0)
146 
147 #define KASAN_TEST_NEEDS_CONFIG_OFF(test, config) do {                  \
148         if (IS_ENABLED(config))                                         \
149                 kunit_skip((test), "Test requires " #config "=n");      \
150 } while (0)
151 
152 #define KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test) do {               \
153         if (IS_ENABLED(CONFIG_KASAN_HW_TAGS))                           \
154                 break;  /* No compiler instrumentation. */              \
155         if (IS_ENABLED(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX))        \
156                 break;  /* Should always be instrumented! */            \
157         if (IS_ENABLED(CONFIG_GENERIC_ENTRY))                           \
158                 kunit_skip((test), "Test requires checked mem*()");     \
159 } while (0)
160 
161 static void kmalloc_oob_right(struct kunit *test)
162 {
163         char *ptr;
164         size_t size = 128 - KASAN_GRANULE_SIZE - 5;
165 
166         ptr = kmalloc(size, GFP_KERNEL);
167         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
168 
169         OPTIMIZER_HIDE_VAR(ptr);
170         /*
171          * An unaligned access past the requested kmalloc size.
172          * Only generic KASAN can precisely detect these.
173          */
174         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
175                 KUNIT_EXPECT_KASAN_FAIL(test, ptr[size] = 'x');
176 
177         /*
178          * An aligned access into the first out-of-bounds granule that falls
179          * within the aligned kmalloc object.
180          */
181         KUNIT_EXPECT_KASAN_FAIL(test, ptr[size + 5] = 'y');
182 
183         /* Out-of-bounds access past the aligned kmalloc object. */
184         KUNIT_EXPECT_KASAN_FAIL(test, ptr[0] =
185                                         ptr[size + KASAN_GRANULE_SIZE + 5]);
186 
187         kfree(ptr);
188 }
189 
190 static void kmalloc_oob_left(struct kunit *test)
191 {
192         char *ptr;
193         size_t size = 15;
194 
195         ptr = kmalloc(size, GFP_KERNEL);
196         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
197 
198         OPTIMIZER_HIDE_VAR(ptr);
199         KUNIT_EXPECT_KASAN_FAIL(test, *ptr = *(ptr - 1));
200         kfree(ptr);
201 }
202 
203 static void kmalloc_node_oob_right(struct kunit *test)
204 {
205         char *ptr;
206         size_t size = 4096;
207 
208         ptr = kmalloc_node(size, GFP_KERNEL, 0);
209         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
210 
211         OPTIMIZER_HIDE_VAR(ptr);
212         KUNIT_EXPECT_KASAN_FAIL(test, ptr[0] = ptr[size]);
213         kfree(ptr);
214 }
215 
216 /*
217  * Check that KASAN detects an out-of-bounds access for a big object allocated
218  * via kmalloc(). But not as big as to trigger the page_alloc fallback.
219  */
220 static void kmalloc_big_oob_right(struct kunit *test)
221 {
222         char *ptr;
223         size_t size = KMALLOC_MAX_CACHE_SIZE - 256;
224 
225         ptr = kmalloc(size, GFP_KERNEL);
226         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
227 
228         OPTIMIZER_HIDE_VAR(ptr);
229         KUNIT_EXPECT_KASAN_FAIL(test, ptr[size] = 0);
230         kfree(ptr);
231 }
232 
233 /*
234  * The kmalloc_large_* tests below use kmalloc() to allocate a memory chunk
235  * that does not fit into the largest slab cache and therefore is allocated via
236  * the page_alloc fallback.
237  */
238 
239 static void kmalloc_large_oob_right(struct kunit *test)
240 {
241         char *ptr;
242         size_t size = KMALLOC_MAX_CACHE_SIZE + 10;
243 
244         ptr = kmalloc(size, GFP_KERNEL);
245         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
246 
247         OPTIMIZER_HIDE_VAR(ptr);
248         KUNIT_EXPECT_KASAN_FAIL(test, ptr[size + OOB_TAG_OFF] = 0);
249 
250         kfree(ptr);
251 }
252 
253 static void kmalloc_large_uaf(struct kunit *test)
254 {
255         char *ptr;
256         size_t size = KMALLOC_MAX_CACHE_SIZE + 10;
257 
258         ptr = kmalloc(size, GFP_KERNEL);
259         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
260         kfree(ptr);
261 
262         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[0]);
263 }
264 
265 static void kmalloc_large_invalid_free(struct kunit *test)
266 {
267         char *ptr;
268         size_t size = KMALLOC_MAX_CACHE_SIZE + 10;
269 
270         ptr = kmalloc(size, GFP_KERNEL);
271         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
272 
273         KUNIT_EXPECT_KASAN_FAIL(test, kfree(ptr + 1));
274 }
275 
276 static void page_alloc_oob_right(struct kunit *test)
277 {
278         char *ptr;
279         struct page *pages;
280         size_t order = 4;
281         size_t size = (1UL << (PAGE_SHIFT + order));
282 
283         /*
284          * With generic KASAN page allocations have no redzones, thus
285          * out-of-bounds detection is not guaranteed.
286          * See https://bugzilla.kernel.org/show_bug.cgi?id=210503.
287          */
288         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
289 
290         pages = alloc_pages(GFP_KERNEL, order);
291         ptr = page_address(pages);
292         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
293 
294         KUNIT_EXPECT_KASAN_FAIL(test, ptr[0] = ptr[size]);
295         free_pages((unsigned long)ptr, order);
296 }
297 
298 static void page_alloc_uaf(struct kunit *test)
299 {
300         char *ptr;
301         struct page *pages;
302         size_t order = 4;
303 
304         pages = alloc_pages(GFP_KERNEL, order);
305         ptr = page_address(pages);
306         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
307         free_pages((unsigned long)ptr, order);
308 
309         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[0]);
310 }
311 
312 static void krealloc_more_oob_helper(struct kunit *test,
313                                         size_t size1, size_t size2)
314 {
315         char *ptr1, *ptr2;
316         size_t middle;
317 
318         KUNIT_ASSERT_LT(test, size1, size2);
319         middle = size1 + (size2 - size1) / 2;
320 
321         ptr1 = kmalloc(size1, GFP_KERNEL);
322         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
323 
324         ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
325         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
326 
327         /* Suppress -Warray-bounds warnings. */
328         OPTIMIZER_HIDE_VAR(ptr2);
329 
330         /* All offsets up to size2 must be accessible. */
331         ptr2[size1 - 1] = 'x';
332         ptr2[size1] = 'x';
333         ptr2[middle] = 'x';
334         ptr2[size2 - 1] = 'x';
335 
336         /* Generic mode is precise, so unaligned size2 must be inaccessible. */
337         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
338                 KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size2] = 'x');
339 
340         /* For all modes first aligned offset after size2 must be inaccessible. */
341         KUNIT_EXPECT_KASAN_FAIL(test,
342                 ptr2[round_up(size2, KASAN_GRANULE_SIZE)] = 'x');
343 
344         kfree(ptr2);
345 }
346 
347 static void krealloc_less_oob_helper(struct kunit *test,
348                                         size_t size1, size_t size2)
349 {
350         char *ptr1, *ptr2;
351         size_t middle;
352 
353         KUNIT_ASSERT_LT(test, size2, size1);
354         middle = size2 + (size1 - size2) / 2;
355 
356         ptr1 = kmalloc(size1, GFP_KERNEL);
357         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
358 
359         ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
360         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
361 
362         /* Suppress -Warray-bounds warnings. */
363         OPTIMIZER_HIDE_VAR(ptr2);
364 
365         /* Must be accessible for all modes. */
366         ptr2[size2 - 1] = 'x';
367 
368         /* Generic mode is precise, so unaligned size2 must be inaccessible. */
369         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
370                 KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size2] = 'x');
371 
372         /* For all modes first aligned offset after size2 must be inaccessible. */
373         KUNIT_EXPECT_KASAN_FAIL(test,
374                 ptr2[round_up(size2, KASAN_GRANULE_SIZE)] = 'x');
375 
376         /*
377          * For all modes all size2, middle, and size1 should land in separate
378          * granules and thus the latter two offsets should be inaccessible.
379          */
380         KUNIT_EXPECT_LE(test, round_up(size2, KASAN_GRANULE_SIZE),
381                                 round_down(middle, KASAN_GRANULE_SIZE));
382         KUNIT_EXPECT_LE(test, round_up(middle, KASAN_GRANULE_SIZE),
383                                 round_down(size1, KASAN_GRANULE_SIZE));
384         KUNIT_EXPECT_KASAN_FAIL(test, ptr2[middle] = 'x');
385         KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size1 - 1] = 'x');
386         KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size1] = 'x');
387 
388         kfree(ptr2);
389 }
390 
391 static void krealloc_more_oob(struct kunit *test)
392 {
393         krealloc_more_oob_helper(test, 201, 235);
394 }
395 
396 static void krealloc_less_oob(struct kunit *test)
397 {
398         krealloc_less_oob_helper(test, 235, 201);
399 }
400 
401 static void krealloc_large_more_oob(struct kunit *test)
402 {
403         krealloc_more_oob_helper(test, KMALLOC_MAX_CACHE_SIZE + 201,
404                                         KMALLOC_MAX_CACHE_SIZE + 235);
405 }
406 
407 static void krealloc_large_less_oob(struct kunit *test)
408 {
409         krealloc_less_oob_helper(test, KMALLOC_MAX_CACHE_SIZE + 235,
410                                         KMALLOC_MAX_CACHE_SIZE + 201);
411 }
412 
413 /*
414  * Check that krealloc() detects a use-after-free, returns NULL,
415  * and doesn't unpoison the freed object.
416  */
417 static void krealloc_uaf(struct kunit *test)
418 {
419         char *ptr1, *ptr2;
420         int size1 = 201;
421         int size2 = 235;
422 
423         ptr1 = kmalloc(size1, GFP_KERNEL);
424         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
425         kfree(ptr1);
426 
427         KUNIT_EXPECT_KASAN_FAIL(test, ptr2 = krealloc(ptr1, size2, GFP_KERNEL));
428         KUNIT_ASSERT_NULL(test, ptr2);
429         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)ptr1);
430 }
431 
432 static void kmalloc_oob_16(struct kunit *test)
433 {
434         struct {
435                 u64 words[2];
436         } *ptr1, *ptr2;
437 
438         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
439 
440         /* This test is specifically crafted for the generic mode. */
441         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
442 
443         /* RELOC_HIDE to prevent gcc from warning about short alloc */
444         ptr1 = RELOC_HIDE(kmalloc(sizeof(*ptr1) - 3, GFP_KERNEL), 0);
445         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
446 
447         ptr2 = kmalloc(sizeof(*ptr2), GFP_KERNEL);
448         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
449 
450         OPTIMIZER_HIDE_VAR(ptr1);
451         OPTIMIZER_HIDE_VAR(ptr2);
452         KUNIT_EXPECT_KASAN_FAIL(test, *ptr1 = *ptr2);
453         kfree(ptr1);
454         kfree(ptr2);
455 }
456 
457 static void kmalloc_uaf_16(struct kunit *test)
458 {
459         struct {
460                 u64 words[2];
461         } *ptr1, *ptr2;
462 
463         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
464 
465         ptr1 = kmalloc(sizeof(*ptr1), GFP_KERNEL);
466         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
467 
468         ptr2 = kmalloc(sizeof(*ptr2), GFP_KERNEL);
469         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
470         kfree(ptr2);
471 
472         KUNIT_EXPECT_KASAN_FAIL(test, *ptr1 = *ptr2);
473         kfree(ptr1);
474 }
475 
476 /*
477  * Note: in the memset tests below, the written range touches both valid and
478  * invalid memory. This makes sure that the instrumentation does not only check
479  * the starting address but the whole range.
480  */
481 
482 static void kmalloc_oob_memset_2(struct kunit *test)
483 {
484         char *ptr;
485         size_t size = 128 - KASAN_GRANULE_SIZE;
486         size_t memset_size = 2;
487 
488         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
489 
490         ptr = kmalloc(size, GFP_KERNEL);
491         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
492 
493         OPTIMIZER_HIDE_VAR(ptr);
494         OPTIMIZER_HIDE_VAR(size);
495         OPTIMIZER_HIDE_VAR(memset_size);
496         KUNIT_EXPECT_KASAN_FAIL(test, memset(ptr + size - 1, 0, memset_size));
497         kfree(ptr);
498 }
499 
500 static void kmalloc_oob_memset_4(struct kunit *test)
501 {
502         char *ptr;
503         size_t size = 128 - KASAN_GRANULE_SIZE;
504         size_t memset_size = 4;
505 
506         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
507 
508         ptr = kmalloc(size, GFP_KERNEL);
509         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
510 
511         OPTIMIZER_HIDE_VAR(ptr);
512         OPTIMIZER_HIDE_VAR(size);
513         OPTIMIZER_HIDE_VAR(memset_size);
514         KUNIT_EXPECT_KASAN_FAIL(test, memset(ptr + size - 3, 0, memset_size));
515         kfree(ptr);
516 }
517 
518 static void kmalloc_oob_memset_8(struct kunit *test)
519 {
520         char *ptr;
521         size_t size = 128 - KASAN_GRANULE_SIZE;
522         size_t memset_size = 8;
523 
524         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
525 
526         ptr = kmalloc(size, GFP_KERNEL);
527         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
528 
529         OPTIMIZER_HIDE_VAR(ptr);
530         OPTIMIZER_HIDE_VAR(size);
531         OPTIMIZER_HIDE_VAR(memset_size);
532         KUNIT_EXPECT_KASAN_FAIL(test, memset(ptr + size - 7, 0, memset_size));
533         kfree(ptr);
534 }
535 
536 static void kmalloc_oob_memset_16(struct kunit *test)
537 {
538         char *ptr;
539         size_t size = 128 - KASAN_GRANULE_SIZE;
540         size_t memset_size = 16;
541 
542         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
543 
544         ptr = kmalloc(size, GFP_KERNEL);
545         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
546 
547         OPTIMIZER_HIDE_VAR(ptr);
548         OPTIMIZER_HIDE_VAR(size);
549         OPTIMIZER_HIDE_VAR(memset_size);
550         KUNIT_EXPECT_KASAN_FAIL(test, memset(ptr + size - 15, 0, memset_size));
551         kfree(ptr);
552 }
553 
554 static void kmalloc_oob_in_memset(struct kunit *test)
555 {
556         char *ptr;
557         size_t size = 128 - KASAN_GRANULE_SIZE;
558 
559         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
560 
561         ptr = kmalloc(size, GFP_KERNEL);
562         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
563 
564         OPTIMIZER_HIDE_VAR(ptr);
565         OPTIMIZER_HIDE_VAR(size);
566         KUNIT_EXPECT_KASAN_FAIL(test,
567                                 memset(ptr, 0, size + KASAN_GRANULE_SIZE));
568         kfree(ptr);
569 }
570 
571 static void kmalloc_memmove_negative_size(struct kunit *test)
572 {
573         char *ptr;
574         size_t size = 64;
575         size_t invalid_size = -2;
576 
577         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
578 
579         /*
580          * Hardware tag-based mode doesn't check memmove for negative size.
581          * As a result, this test introduces a side-effect memory corruption,
582          * which can result in a crash.
583          */
584         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_HW_TAGS);
585 
586         ptr = kmalloc(size, GFP_KERNEL);
587         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
588 
589         memset((char *)ptr, 0, 64);
590         OPTIMIZER_HIDE_VAR(ptr);
591         OPTIMIZER_HIDE_VAR(invalid_size);
592         KUNIT_EXPECT_KASAN_FAIL(test,
593                 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
594         kfree(ptr);
595 }
596 
597 static void kmalloc_memmove_invalid_size(struct kunit *test)
598 {
599         char *ptr;
600         size_t size = 64;
601         size_t invalid_size = size;
602 
603         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
604 
605         ptr = kmalloc(size, GFP_KERNEL);
606         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
607 
608         memset((char *)ptr, 0, 64);
609         OPTIMIZER_HIDE_VAR(ptr);
610         OPTIMIZER_HIDE_VAR(invalid_size);
611         KUNIT_EXPECT_KASAN_FAIL(test,
612                 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
613         kfree(ptr);
614 }
615 
616 static void kmalloc_uaf(struct kunit *test)
617 {
618         char *ptr;
619         size_t size = 10;
620 
621         ptr = kmalloc(size, GFP_KERNEL);
622         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
623 
624         kfree(ptr);
625         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[8]);
626 }
627 
628 static void kmalloc_uaf_memset(struct kunit *test)
629 {
630         char *ptr;
631         size_t size = 33;
632 
633         KASAN_TEST_NEEDS_CHECKED_MEMINTRINSICS(test);
634 
635         /*
636          * Only generic KASAN uses quarantine, which is required to avoid a
637          * kernel memory corruption this test causes.
638          */
639         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
640 
641         ptr = kmalloc(size, GFP_KERNEL);
642         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
643 
644         kfree(ptr);
645         KUNIT_EXPECT_KASAN_FAIL(test, memset(ptr, 0, size));
646 }
647 
648 static void kmalloc_uaf2(struct kunit *test)
649 {
650         char *ptr1, *ptr2;
651         size_t size = 43;
652         int counter = 0;
653 
654 again:
655         ptr1 = kmalloc(size, GFP_KERNEL);
656         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
657 
658         kfree(ptr1);
659 
660         ptr2 = kmalloc(size, GFP_KERNEL);
661         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
662 
663         /*
664          * For tag-based KASAN ptr1 and ptr2 tags might happen to be the same.
665          * Allow up to 16 attempts at generating different tags.
666          */
667         if (!IS_ENABLED(CONFIG_KASAN_GENERIC) && ptr1 == ptr2 && counter++ < 16) {
668                 kfree(ptr2);
669                 goto again;
670         }
671 
672         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr1)[40]);
673         KUNIT_EXPECT_PTR_NE(test, ptr1, ptr2);
674 
675         kfree(ptr2);
676 }
677 
678 /*
679  * Check that KASAN detects use-after-free when another object was allocated in
680  * the same slot. Relevant for the tag-based modes, which do not use quarantine.
681  */
682 static void kmalloc_uaf3(struct kunit *test)
683 {
684         char *ptr1, *ptr2;
685         size_t size = 100;
686 
687         /* This test is specifically crafted for tag-based modes. */
688         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
689 
690         ptr1 = kmalloc(size, GFP_KERNEL);
691         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
692         kfree(ptr1);
693 
694         ptr2 = kmalloc(size, GFP_KERNEL);
695         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
696         kfree(ptr2);
697 
698         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr1)[8]);
699 }
700 
701 static void kasan_atomics_helper(struct kunit *test, void *unsafe, void *safe)
702 {
703         int *i_unsafe = unsafe;
704 
705         KUNIT_EXPECT_KASAN_FAIL(test, READ_ONCE(*i_unsafe));
706         KUNIT_EXPECT_KASAN_FAIL(test, WRITE_ONCE(*i_unsafe, 42));
707         KUNIT_EXPECT_KASAN_FAIL(test, smp_load_acquire(i_unsafe));
708         KUNIT_EXPECT_KASAN_FAIL(test, smp_store_release(i_unsafe, 42));
709 
710         KUNIT_EXPECT_KASAN_FAIL(test, atomic_read(unsafe));
711         KUNIT_EXPECT_KASAN_FAIL(test, atomic_set(unsafe, 42));
712         KUNIT_EXPECT_KASAN_FAIL(test, atomic_add(42, unsafe));
713         KUNIT_EXPECT_KASAN_FAIL(test, atomic_sub(42, unsafe));
714         KUNIT_EXPECT_KASAN_FAIL(test, atomic_inc(unsafe));
715         KUNIT_EXPECT_KASAN_FAIL(test, atomic_dec(unsafe));
716         KUNIT_EXPECT_KASAN_FAIL(test, atomic_and(42, unsafe));
717         KUNIT_EXPECT_KASAN_FAIL(test, atomic_andnot(42, unsafe));
718         KUNIT_EXPECT_KASAN_FAIL(test, atomic_or(42, unsafe));
719         KUNIT_EXPECT_KASAN_FAIL(test, atomic_xor(42, unsafe));
720         KUNIT_EXPECT_KASAN_FAIL(test, atomic_xchg(unsafe, 42));
721         KUNIT_EXPECT_KASAN_FAIL(test, atomic_cmpxchg(unsafe, 21, 42));
722         KUNIT_EXPECT_KASAN_FAIL(test, atomic_try_cmpxchg(unsafe, safe, 42));
723         KUNIT_EXPECT_KASAN_FAIL(test, atomic_try_cmpxchg(safe, unsafe, 42));
724         KUNIT_EXPECT_KASAN_FAIL(test, atomic_sub_and_test(42, unsafe));
725         KUNIT_EXPECT_KASAN_FAIL(test, atomic_dec_and_test(unsafe));
726         KUNIT_EXPECT_KASAN_FAIL(test, atomic_inc_and_test(unsafe));
727         KUNIT_EXPECT_KASAN_FAIL(test, atomic_add_negative(42, unsafe));
728         KUNIT_EXPECT_KASAN_FAIL(test, atomic_add_unless(unsafe, 21, 42));
729         KUNIT_EXPECT_KASAN_FAIL(test, atomic_inc_not_zero(unsafe));
730         KUNIT_EXPECT_KASAN_FAIL(test, atomic_inc_unless_negative(unsafe));
731         KUNIT_EXPECT_KASAN_FAIL(test, atomic_dec_unless_positive(unsafe));
732         KUNIT_EXPECT_KASAN_FAIL(test, atomic_dec_if_positive(unsafe));
733 
734         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_read(unsafe));
735         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_set(unsafe, 42));
736         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_add(42, unsafe));
737         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_sub(42, unsafe));
738         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_inc(unsafe));
739         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_dec(unsafe));
740         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_and(42, unsafe));
741         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_andnot(42, unsafe));
742         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_or(42, unsafe));
743         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_xor(42, unsafe));
744         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_xchg(unsafe, 42));
745         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_cmpxchg(unsafe, 21, 42));
746         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_try_cmpxchg(unsafe, safe, 42));
747         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_try_cmpxchg(safe, unsafe, 42));
748         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_sub_and_test(42, unsafe));
749         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_dec_and_test(unsafe));
750         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_inc_and_test(unsafe));
751         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_add_negative(42, unsafe));
752         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_add_unless(unsafe, 21, 42));
753         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_inc_not_zero(unsafe));
754         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_inc_unless_negative(unsafe));
755         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_dec_unless_positive(unsafe));
756         KUNIT_EXPECT_KASAN_FAIL(test, atomic_long_dec_if_positive(unsafe));
757 }
758 
759 static void kasan_atomics(struct kunit *test)
760 {
761         void *a1, *a2;
762 
763         /*
764          * Just as with kasan_bitops_tags(), we allocate 48 bytes of memory such
765          * that the following 16 bytes will make up the redzone.
766          */
767         a1 = kzalloc(48, GFP_KERNEL);
768         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, a1);
769         a2 = kzalloc(sizeof(atomic_long_t), GFP_KERNEL);
770         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, a2);
771 
772         /* Use atomics to access the redzone. */
773         kasan_atomics_helper(test, a1 + 48, a2);
774 
775         kfree(a1);
776         kfree(a2);
777 }
778 
779 static void kmalloc_double_kzfree(struct kunit *test)
780 {
781         char *ptr;
782         size_t size = 16;
783 
784         ptr = kmalloc(size, GFP_KERNEL);
785         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
786 
787         kfree_sensitive(ptr);
788         KUNIT_EXPECT_KASAN_FAIL(test, kfree_sensitive(ptr));
789 }
790 
791 /* Check that ksize() does NOT unpoison whole object. */
792 static void ksize_unpoisons_memory(struct kunit *test)
793 {
794         char *ptr;
795         size_t size = 128 - KASAN_GRANULE_SIZE - 5;
796         size_t real_size;
797 
798         ptr = kmalloc(size, GFP_KERNEL);
799         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
800 
801         real_size = ksize(ptr);
802         KUNIT_EXPECT_GT(test, real_size, size);
803 
804         OPTIMIZER_HIDE_VAR(ptr);
805 
806         /* These accesses shouldn't trigger a KASAN report. */
807         ptr[0] = 'x';
808         ptr[size - 1] = 'x';
809 
810         /* These must trigger a KASAN report. */
811         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
812                 KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[size]);
813         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[size + 5]);
814         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[real_size - 1]);
815 
816         kfree(ptr);
817 }
818 
819 /*
820  * Check that a use-after-free is detected by ksize() and via normal accesses
821  * after it.
822  */
823 static void ksize_uaf(struct kunit *test)
824 {
825         char *ptr;
826         int size = 128 - KASAN_GRANULE_SIZE;
827 
828         ptr = kmalloc(size, GFP_KERNEL);
829         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
830         kfree(ptr);
831 
832         OPTIMIZER_HIDE_VAR(ptr);
833         KUNIT_EXPECT_KASAN_FAIL(test, ksize(ptr));
834         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[0]);
835         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[size]);
836 }
837 
838 /*
839  * The two tests below check that Generic KASAN prints auxiliary stack traces
840  * for RCU callbacks and workqueues. The reports need to be inspected manually.
841  *
842  * These tests are still enabled for other KASAN modes to make sure that all
843  * modes report bad accesses in tested scenarios.
844  */
845 
846 static struct kasan_rcu_info {
847         int i;
848         struct rcu_head rcu;
849 } *global_rcu_ptr;
850 
851 static void rcu_uaf_reclaim(struct rcu_head *rp)
852 {
853         struct kasan_rcu_info *fp =
854                 container_of(rp, struct kasan_rcu_info, rcu);
855 
856         kfree(fp);
857         ((volatile struct kasan_rcu_info *)fp)->i;
858 }
859 
860 static void rcu_uaf(struct kunit *test)
861 {
862         struct kasan_rcu_info *ptr;
863 
864         ptr = kmalloc(sizeof(struct kasan_rcu_info), GFP_KERNEL);
865         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
866 
867         global_rcu_ptr = rcu_dereference_protected(
868                                 (struct kasan_rcu_info __rcu *)ptr, NULL);
869 
870         KUNIT_EXPECT_KASAN_FAIL(test,
871                 call_rcu(&global_rcu_ptr->rcu, rcu_uaf_reclaim);
872                 rcu_barrier());
873 }
874 
875 static void workqueue_uaf_work(struct work_struct *work)
876 {
877         kfree(work);
878 }
879 
880 static void workqueue_uaf(struct kunit *test)
881 {
882         struct workqueue_struct *workqueue;
883         struct work_struct *work;
884 
885         workqueue = create_workqueue("kasan_workqueue_test");
886         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, workqueue);
887 
888         work = kmalloc(sizeof(struct work_struct), GFP_KERNEL);
889         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, work);
890 
891         INIT_WORK(work, workqueue_uaf_work);
892         queue_work(workqueue, work);
893         destroy_workqueue(workqueue);
894 
895         KUNIT_EXPECT_KASAN_FAIL(test,
896                 ((volatile struct work_struct *)work)->data);
897 }
898 
899 static void kfree_via_page(struct kunit *test)
900 {
901         char *ptr;
902         size_t size = 8;
903         struct page *page;
904         unsigned long offset;
905 
906         ptr = kmalloc(size, GFP_KERNEL);
907         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
908 
909         page = virt_to_page(ptr);
910         offset = offset_in_page(ptr);
911         kfree(page_address(page) + offset);
912 }
913 
914 static void kfree_via_phys(struct kunit *test)
915 {
916         char *ptr;
917         size_t size = 8;
918         phys_addr_t phys;
919 
920         ptr = kmalloc(size, GFP_KERNEL);
921         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
922 
923         phys = virt_to_phys(ptr);
924         kfree(phys_to_virt(phys));
925 }
926 
927 static void kmem_cache_oob(struct kunit *test)
928 {
929         char *p;
930         size_t size = 200;
931         struct kmem_cache *cache;
932 
933         cache = kmem_cache_create("test_cache", size, 0, 0, NULL);
934         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
935 
936         p = kmem_cache_alloc(cache, GFP_KERNEL);
937         if (!p) {
938                 kunit_err(test, "Allocation failed: %s\n", __func__);
939                 kmem_cache_destroy(cache);
940                 return;
941         }
942 
943         KUNIT_EXPECT_KASAN_FAIL(test, *p = p[size + OOB_TAG_OFF]);
944 
945         kmem_cache_free(cache, p);
946         kmem_cache_destroy(cache);
947 }
948 
949 static void kmem_cache_double_free(struct kunit *test)
950 {
951         char *p;
952         size_t size = 200;
953         struct kmem_cache *cache;
954 
955         cache = kmem_cache_create("test_cache", size, 0, 0, NULL);
956         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
957 
958         p = kmem_cache_alloc(cache, GFP_KERNEL);
959         if (!p) {
960                 kunit_err(test, "Allocation failed: %s\n", __func__);
961                 kmem_cache_destroy(cache);
962                 return;
963         }
964 
965         kmem_cache_free(cache, p);
966         KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_free(cache, p));
967         kmem_cache_destroy(cache);
968 }
969 
970 static void kmem_cache_invalid_free(struct kunit *test)
971 {
972         char *p;
973         size_t size = 200;
974         struct kmem_cache *cache;
975 
976         cache = kmem_cache_create("test_cache", size, 0, SLAB_TYPESAFE_BY_RCU,
977                                   NULL);
978         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
979 
980         p = kmem_cache_alloc(cache, GFP_KERNEL);
981         if (!p) {
982                 kunit_err(test, "Allocation failed: %s\n", __func__);
983                 kmem_cache_destroy(cache);
984                 return;
985         }
986 
987         /* Trigger invalid free, the object doesn't get freed. */
988         KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_free(cache, p + 1));
989 
990         /*
991          * Properly free the object to prevent the "Objects remaining in
992          * test_cache on __kmem_cache_shutdown" BUG failure.
993          */
994         kmem_cache_free(cache, p);
995 
996         kmem_cache_destroy(cache);
997 }
998 
999 static void kmem_cache_rcu_uaf(struct kunit *test)
1000 {
1001         char *p;
1002         size_t size = 200;
1003         struct kmem_cache *cache;
1004 
1005         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_SLUB_RCU_DEBUG);
1006 
1007         cache = kmem_cache_create("test_cache", size, 0, SLAB_TYPESAFE_BY_RCU,
1008                                   NULL);
1009         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
1010 
1011         p = kmem_cache_alloc(cache, GFP_KERNEL);
1012         if (!p) {
1013                 kunit_err(test, "Allocation failed: %s\n", __func__);
1014                 kmem_cache_destroy(cache);
1015                 return;
1016         }
1017         *p = 1;
1018 
1019         rcu_read_lock();
1020 
1021         /* Free the object - this will internally schedule an RCU callback. */
1022         kmem_cache_free(cache, p);
1023 
1024         /*
1025          * We should still be allowed to access the object at this point because
1026          * the cache is SLAB_TYPESAFE_BY_RCU and we've been in an RCU read-side
1027          * critical section since before the kmem_cache_free().
1028          */
1029         READ_ONCE(*p);
1030 
1031         rcu_read_unlock();
1032 
1033         /*
1034          * Wait for the RCU callback to execute; after this, the object should
1035          * have actually been freed from KASAN's perspective.
1036          */
1037         rcu_barrier();
1038 
1039         KUNIT_EXPECT_KASAN_FAIL(test, READ_ONCE(*p));
1040 
1041         kmem_cache_destroy(cache);
1042 }
1043 
1044 static void empty_cache_ctor(void *object) { }
1045 
1046 static void kmem_cache_double_destroy(struct kunit *test)
1047 {
1048         struct kmem_cache *cache;
1049 
1050         /* Provide a constructor to prevent cache merging. */
1051         cache = kmem_cache_create("test_cache", 200, 0, 0, empty_cache_ctor);
1052         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
1053         kmem_cache_destroy(cache);
1054         KUNIT_EXPECT_KASAN_FAIL(test, kmem_cache_destroy(cache));
1055 }
1056 
1057 static void kmem_cache_accounted(struct kunit *test)
1058 {
1059         int i;
1060         char *p;
1061         size_t size = 200;
1062         struct kmem_cache *cache;
1063 
1064         cache = kmem_cache_create("test_cache", size, 0, SLAB_ACCOUNT, NULL);
1065         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
1066 
1067         /*
1068          * Several allocations with a delay to allow for lazy per memcg kmem
1069          * cache creation.
1070          */
1071         for (i = 0; i < 5; i++) {
1072                 p = kmem_cache_alloc(cache, GFP_KERNEL);
1073                 if (!p)
1074                         goto free_cache;
1075 
1076                 kmem_cache_free(cache, p);
1077                 msleep(100);
1078         }
1079 
1080 free_cache:
1081         kmem_cache_destroy(cache);
1082 }
1083 
1084 static void kmem_cache_bulk(struct kunit *test)
1085 {
1086         struct kmem_cache *cache;
1087         size_t size = 200;
1088         char *p[10];
1089         bool ret;
1090         int i;
1091 
1092         cache = kmem_cache_create("test_cache", size, 0, 0, NULL);
1093         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
1094 
1095         ret = kmem_cache_alloc_bulk(cache, GFP_KERNEL, ARRAY_SIZE(p), (void **)&p);
1096         if (!ret) {
1097                 kunit_err(test, "Allocation failed: %s\n", __func__);
1098                 kmem_cache_destroy(cache);
1099                 return;
1100         }
1101 
1102         for (i = 0; i < ARRAY_SIZE(p); i++)
1103                 p[i][0] = p[i][size - 1] = 42;
1104 
1105         kmem_cache_free_bulk(cache, ARRAY_SIZE(p), (void **)&p);
1106         kmem_cache_destroy(cache);
1107 }
1108 
1109 static void *mempool_prepare_kmalloc(struct kunit *test, mempool_t *pool, size_t size)
1110 {
1111         int pool_size = 4;
1112         int ret;
1113         void *elem;
1114 
1115         memset(pool, 0, sizeof(*pool));
1116         ret = mempool_init_kmalloc_pool(pool, pool_size, size);
1117         KUNIT_ASSERT_EQ(test, ret, 0);
1118 
1119         /*
1120          * Allocate one element to prevent mempool from freeing elements to the
1121          * underlying allocator and instead make it add them to the element
1122          * list when the tests trigger double-free and invalid-free bugs.
1123          * This allows testing KASAN annotations in add_element().
1124          */
1125         elem = mempool_alloc_preallocated(pool);
1126         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1127 
1128         return elem;
1129 }
1130 
1131 static struct kmem_cache *mempool_prepare_slab(struct kunit *test, mempool_t *pool, size_t size)
1132 {
1133         struct kmem_cache *cache;
1134         int pool_size = 4;
1135         int ret;
1136 
1137         cache = kmem_cache_create("test_cache", size, 0, 0, NULL);
1138         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cache);
1139 
1140         memset(pool, 0, sizeof(*pool));
1141         ret = mempool_init_slab_pool(pool, pool_size, cache);
1142         KUNIT_ASSERT_EQ(test, ret, 0);
1143 
1144         /*
1145          * Do not allocate one preallocated element, as we skip the double-free
1146          * and invalid-free tests for slab mempool for simplicity.
1147          */
1148 
1149         return cache;
1150 }
1151 
1152 static void *mempool_prepare_page(struct kunit *test, mempool_t *pool, int order)
1153 {
1154         int pool_size = 4;
1155         int ret;
1156         void *elem;
1157 
1158         memset(pool, 0, sizeof(*pool));
1159         ret = mempool_init_page_pool(pool, pool_size, order);
1160         KUNIT_ASSERT_EQ(test, ret, 0);
1161 
1162         elem = mempool_alloc_preallocated(pool);
1163         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1164 
1165         return elem;
1166 }
1167 
1168 static void mempool_oob_right_helper(struct kunit *test, mempool_t *pool, size_t size)
1169 {
1170         char *elem;
1171 
1172         elem = mempool_alloc_preallocated(pool);
1173         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1174 
1175         OPTIMIZER_HIDE_VAR(elem);
1176 
1177         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
1178                 KUNIT_EXPECT_KASAN_FAIL(test,
1179                         ((volatile char *)&elem[size])[0]);
1180         else
1181                 KUNIT_EXPECT_KASAN_FAIL(test,
1182                         ((volatile char *)&elem[round_up(size, KASAN_GRANULE_SIZE)])[0]);
1183 
1184         mempool_free(elem, pool);
1185 }
1186 
1187 static void mempool_kmalloc_oob_right(struct kunit *test)
1188 {
1189         mempool_t pool;
1190         size_t size = 128 - KASAN_GRANULE_SIZE - 5;
1191         void *extra_elem;
1192 
1193         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1194 
1195         mempool_oob_right_helper(test, &pool, size);
1196 
1197         mempool_free(extra_elem, &pool);
1198         mempool_exit(&pool);
1199 }
1200 
1201 static void mempool_kmalloc_large_oob_right(struct kunit *test)
1202 {
1203         mempool_t pool;
1204         size_t size = KMALLOC_MAX_CACHE_SIZE + 1;
1205         void *extra_elem;
1206 
1207         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1208 
1209         mempool_oob_right_helper(test, &pool, size);
1210 
1211         mempool_free(extra_elem, &pool);
1212         mempool_exit(&pool);
1213 }
1214 
1215 static void mempool_slab_oob_right(struct kunit *test)
1216 {
1217         mempool_t pool;
1218         size_t size = 123;
1219         struct kmem_cache *cache;
1220 
1221         cache = mempool_prepare_slab(test, &pool, size);
1222 
1223         mempool_oob_right_helper(test, &pool, size);
1224 
1225         mempool_exit(&pool);
1226         kmem_cache_destroy(cache);
1227 }
1228 
1229 /*
1230  * Skip the out-of-bounds test for page mempool. With Generic KASAN, page
1231  * allocations have no redzones, and thus the out-of-bounds detection is not
1232  * guaranteed; see https://bugzilla.kernel.org/show_bug.cgi?id=210503. With
1233  * the tag-based KASAN modes, the neighboring allocation might have the same
1234  * tag; see https://bugzilla.kernel.org/show_bug.cgi?id=203505.
1235  */
1236 
1237 static void mempool_uaf_helper(struct kunit *test, mempool_t *pool, bool page)
1238 {
1239         char *elem, *ptr;
1240 
1241         elem = mempool_alloc_preallocated(pool);
1242         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1243 
1244         mempool_free(elem, pool);
1245 
1246         ptr = page ? page_address((struct page *)elem) : elem;
1247         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)ptr)[0]);
1248 }
1249 
1250 static void mempool_kmalloc_uaf(struct kunit *test)
1251 {
1252         mempool_t pool;
1253         size_t size = 128;
1254         void *extra_elem;
1255 
1256         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1257 
1258         mempool_uaf_helper(test, &pool, false);
1259 
1260         mempool_free(extra_elem, &pool);
1261         mempool_exit(&pool);
1262 }
1263 
1264 static void mempool_kmalloc_large_uaf(struct kunit *test)
1265 {
1266         mempool_t pool;
1267         size_t size = KMALLOC_MAX_CACHE_SIZE + 1;
1268         void *extra_elem;
1269 
1270         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1271 
1272         mempool_uaf_helper(test, &pool, false);
1273 
1274         mempool_free(extra_elem, &pool);
1275         mempool_exit(&pool);
1276 }
1277 
1278 static void mempool_slab_uaf(struct kunit *test)
1279 {
1280         mempool_t pool;
1281         size_t size = 123;
1282         struct kmem_cache *cache;
1283 
1284         cache = mempool_prepare_slab(test, &pool, size);
1285 
1286         mempool_uaf_helper(test, &pool, false);
1287 
1288         mempool_exit(&pool);
1289         kmem_cache_destroy(cache);
1290 }
1291 
1292 static void mempool_page_alloc_uaf(struct kunit *test)
1293 {
1294         mempool_t pool;
1295         int order = 2;
1296         void *extra_elem;
1297 
1298         extra_elem = mempool_prepare_page(test, &pool, order);
1299 
1300         mempool_uaf_helper(test, &pool, true);
1301 
1302         mempool_free(extra_elem, &pool);
1303         mempool_exit(&pool);
1304 }
1305 
1306 static void mempool_double_free_helper(struct kunit *test, mempool_t *pool)
1307 {
1308         char *elem;
1309 
1310         elem = mempool_alloc_preallocated(pool);
1311         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1312 
1313         mempool_free(elem, pool);
1314 
1315         KUNIT_EXPECT_KASAN_FAIL(test, mempool_free(elem, pool));
1316 }
1317 
1318 static void mempool_kmalloc_double_free(struct kunit *test)
1319 {
1320         mempool_t pool;
1321         size_t size = 128;
1322         char *extra_elem;
1323 
1324         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1325 
1326         mempool_double_free_helper(test, &pool);
1327 
1328         mempool_free(extra_elem, &pool);
1329         mempool_exit(&pool);
1330 }
1331 
1332 static void mempool_kmalloc_large_double_free(struct kunit *test)
1333 {
1334         mempool_t pool;
1335         size_t size = KMALLOC_MAX_CACHE_SIZE + 1;
1336         char *extra_elem;
1337 
1338         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1339 
1340         mempool_double_free_helper(test, &pool);
1341 
1342         mempool_free(extra_elem, &pool);
1343         mempool_exit(&pool);
1344 }
1345 
1346 static void mempool_page_alloc_double_free(struct kunit *test)
1347 {
1348         mempool_t pool;
1349         int order = 2;
1350         char *extra_elem;
1351 
1352         extra_elem = mempool_prepare_page(test, &pool, order);
1353 
1354         mempool_double_free_helper(test, &pool);
1355 
1356         mempool_free(extra_elem, &pool);
1357         mempool_exit(&pool);
1358 }
1359 
1360 static void mempool_kmalloc_invalid_free_helper(struct kunit *test, mempool_t *pool)
1361 {
1362         char *elem;
1363 
1364         elem = mempool_alloc_preallocated(pool);
1365         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, elem);
1366 
1367         KUNIT_EXPECT_KASAN_FAIL(test, mempool_free(elem + 1, pool));
1368 
1369         mempool_free(elem, pool);
1370 }
1371 
1372 static void mempool_kmalloc_invalid_free(struct kunit *test)
1373 {
1374         mempool_t pool;
1375         size_t size = 128;
1376         char *extra_elem;
1377 
1378         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1379 
1380         mempool_kmalloc_invalid_free_helper(test, &pool);
1381 
1382         mempool_free(extra_elem, &pool);
1383         mempool_exit(&pool);
1384 }
1385 
1386 static void mempool_kmalloc_large_invalid_free(struct kunit *test)
1387 {
1388         mempool_t pool;
1389         size_t size = KMALLOC_MAX_CACHE_SIZE + 1;
1390         char *extra_elem;
1391 
1392         extra_elem = mempool_prepare_kmalloc(test, &pool, size);
1393 
1394         mempool_kmalloc_invalid_free_helper(test, &pool);
1395 
1396         mempool_free(extra_elem, &pool);
1397         mempool_exit(&pool);
1398 }
1399 
1400 /*
1401  * Skip the invalid-free test for page mempool. The invalid-free detection only
1402  * works for compound pages and mempool preallocates all page elements without
1403  * the __GFP_COMP flag.
1404  */
1405 
1406 static char global_array[10];
1407 
1408 static void kasan_global_oob_right(struct kunit *test)
1409 {
1410         /*
1411          * Deliberate out-of-bounds access. To prevent CONFIG_UBSAN_LOCAL_BOUNDS
1412          * from failing here and panicking the kernel, access the array via a
1413          * volatile pointer, which will prevent the compiler from being able to
1414          * determine the array bounds.
1415          *
1416          * This access uses a volatile pointer to char (char *volatile) rather
1417          * than the more conventional pointer to volatile char (volatile char *)
1418          * because we want to prevent the compiler from making inferences about
1419          * the pointer itself (i.e. its array bounds), not the data that it
1420          * refers to.
1421          */
1422         char *volatile array = global_array;
1423         char *p = &array[ARRAY_SIZE(global_array) + 3];
1424 
1425         /* Only generic mode instruments globals. */
1426         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
1427 
1428         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
1429 }
1430 
1431 static void kasan_global_oob_left(struct kunit *test)
1432 {
1433         char *volatile array = global_array;
1434         char *p = array - 3;
1435 
1436         /*
1437          * GCC is known to fail this test, skip it.
1438          * See https://bugzilla.kernel.org/show_bug.cgi?id=215051.
1439          */
1440         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_CC_IS_CLANG);
1441         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
1442         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
1443 }
1444 
1445 static void kasan_stack_oob(struct kunit *test)
1446 {
1447         char stack_array[10];
1448         /* See comment in kasan_global_oob_right. */
1449         char *volatile array = stack_array;
1450         char *p = &array[ARRAY_SIZE(stack_array) + OOB_TAG_OFF];
1451 
1452         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_STACK);
1453 
1454         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
1455 }
1456 
1457 static void kasan_alloca_oob_left(struct kunit *test)
1458 {
1459         volatile int i = 10;
1460         char alloca_array[i];
1461         /* See comment in kasan_global_oob_right. */
1462         char *volatile array = alloca_array;
1463         char *p = array - 1;
1464 
1465         /* Only generic mode instruments dynamic allocas. */
1466         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
1467         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_STACK);
1468 
1469         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
1470 }
1471 
1472 static void kasan_alloca_oob_right(struct kunit *test)
1473 {
1474         volatile int i = 10;
1475         char alloca_array[i];
1476         /* See comment in kasan_global_oob_right. */
1477         char *volatile array = alloca_array;
1478         char *p = array + i;
1479 
1480         /* Only generic mode instruments dynamic allocas. */
1481         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
1482         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_STACK);
1483 
1484         KUNIT_EXPECT_KASAN_FAIL(test, *(volatile char *)p);
1485 }
1486 
1487 static void kasan_memchr(struct kunit *test)
1488 {
1489         char *ptr;
1490         size_t size = 24;
1491 
1492         /*
1493          * str* functions are not instrumented with CONFIG_AMD_MEM_ENCRYPT.
1494          * See https://bugzilla.kernel.org/show_bug.cgi?id=206337 for details.
1495          */
1496         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_AMD_MEM_ENCRYPT);
1497 
1498         if (OOB_TAG_OFF)
1499                 size = round_up(size, OOB_TAG_OFF);
1500 
1501         ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
1502         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1503 
1504         OPTIMIZER_HIDE_VAR(ptr);
1505         OPTIMIZER_HIDE_VAR(size);
1506         KUNIT_EXPECT_KASAN_FAIL(test,
1507                 kasan_ptr_result = memchr(ptr, '1', size + 1));
1508 
1509         kfree(ptr);
1510 }
1511 
1512 static void kasan_memcmp(struct kunit *test)
1513 {
1514         char *ptr;
1515         size_t size = 24;
1516         int arr[9];
1517 
1518         /*
1519          * str* functions are not instrumented with CONFIG_AMD_MEM_ENCRYPT.
1520          * See https://bugzilla.kernel.org/show_bug.cgi?id=206337 for details.
1521          */
1522         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_AMD_MEM_ENCRYPT);
1523 
1524         if (OOB_TAG_OFF)
1525                 size = round_up(size, OOB_TAG_OFF);
1526 
1527         ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
1528         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1529         memset(arr, 0, sizeof(arr));
1530 
1531         OPTIMIZER_HIDE_VAR(ptr);
1532         OPTIMIZER_HIDE_VAR(size);
1533         KUNIT_EXPECT_KASAN_FAIL(test,
1534                 kasan_int_result = memcmp(ptr, arr, size+1));
1535         kfree(ptr);
1536 }
1537 
1538 static void kasan_strings(struct kunit *test)
1539 {
1540         char *ptr;
1541         size_t size = 24;
1542 
1543         /*
1544          * str* functions are not instrumented with CONFIG_AMD_MEM_ENCRYPT.
1545          * See https://bugzilla.kernel.org/show_bug.cgi?id=206337 for details.
1546          */
1547         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_AMD_MEM_ENCRYPT);
1548 
1549         ptr = kmalloc(size, GFP_KERNEL | __GFP_ZERO);
1550         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1551 
1552         kfree(ptr);
1553 
1554         /*
1555          * Try to cause only 1 invalid access (less spam in dmesg).
1556          * For that we need ptr to point to zeroed byte.
1557          * Skip metadata that could be stored in freed object so ptr
1558          * will likely point to zeroed byte.
1559          */
1560         ptr += 16;
1561         KUNIT_EXPECT_KASAN_FAIL(test, kasan_ptr_result = strchr(ptr, '1'));
1562 
1563         KUNIT_EXPECT_KASAN_FAIL(test, kasan_ptr_result = strrchr(ptr, '1'));
1564 
1565         KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result = strcmp(ptr, "2"));
1566 
1567         KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result = strncmp(ptr, "2", 1));
1568 
1569         KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result = strlen(ptr));
1570 
1571         KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result = strnlen(ptr, 1));
1572 }
1573 
1574 static void kasan_bitops_modify(struct kunit *test, int nr, void *addr)
1575 {
1576         KUNIT_EXPECT_KASAN_FAIL(test, set_bit(nr, addr));
1577         KUNIT_EXPECT_KASAN_FAIL(test, __set_bit(nr, addr));
1578         KUNIT_EXPECT_KASAN_FAIL(test, clear_bit(nr, addr));
1579         KUNIT_EXPECT_KASAN_FAIL(test, __clear_bit(nr, addr));
1580         KUNIT_EXPECT_KASAN_FAIL(test, clear_bit_unlock(nr, addr));
1581         KUNIT_EXPECT_KASAN_FAIL(test, __clear_bit_unlock(nr, addr));
1582         KUNIT_EXPECT_KASAN_FAIL(test, change_bit(nr, addr));
1583         KUNIT_EXPECT_KASAN_FAIL(test, __change_bit(nr, addr));
1584 }
1585 
1586 static void kasan_bitops_test_and_modify(struct kunit *test, int nr, void *addr)
1587 {
1588         KUNIT_EXPECT_KASAN_FAIL(test, test_and_set_bit(nr, addr));
1589         KUNIT_EXPECT_KASAN_FAIL(test, __test_and_set_bit(nr, addr));
1590         KUNIT_EXPECT_KASAN_FAIL(test, test_and_set_bit_lock(nr, addr));
1591         KUNIT_EXPECT_KASAN_FAIL(test, test_and_clear_bit(nr, addr));
1592         KUNIT_EXPECT_KASAN_FAIL(test, __test_and_clear_bit(nr, addr));
1593         KUNIT_EXPECT_KASAN_FAIL(test, test_and_change_bit(nr, addr));
1594         KUNIT_EXPECT_KASAN_FAIL(test, __test_and_change_bit(nr, addr));
1595         KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result = test_bit(nr, addr));
1596         if (nr < 7)
1597                 KUNIT_EXPECT_KASAN_FAIL(test, kasan_int_result =
1598                                 xor_unlock_is_negative_byte(1 << nr, addr));
1599 }
1600 
1601 static void kasan_bitops_generic(struct kunit *test)
1602 {
1603         long *bits;
1604 
1605         /* This test is specifically crafted for the generic mode. */
1606         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_GENERIC);
1607 
1608         /*
1609          * Allocate 1 more byte, which causes kzalloc to round up to 16 bytes;
1610          * this way we do not actually corrupt other memory.
1611          */
1612         bits = kzalloc(sizeof(*bits) + 1, GFP_KERNEL);
1613         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bits);
1614 
1615         /*
1616          * Below calls try to access bit within allocated memory; however, the
1617          * below accesses are still out-of-bounds, since bitops are defined to
1618          * operate on the whole long the bit is in.
1619          */
1620         kasan_bitops_modify(test, BITS_PER_LONG, bits);
1621 
1622         /*
1623          * Below calls try to access bit beyond allocated memory.
1624          */
1625         kasan_bitops_test_and_modify(test, BITS_PER_LONG + BITS_PER_BYTE, bits);
1626 
1627         kfree(bits);
1628 }
1629 
1630 static void kasan_bitops_tags(struct kunit *test)
1631 {
1632         long *bits;
1633 
1634         /* This test is specifically crafted for tag-based modes. */
1635         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1636 
1637         /* kmalloc-64 cache will be used and the last 16 bytes will be the redzone. */
1638         bits = kzalloc(48, GFP_KERNEL);
1639         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bits);
1640 
1641         /* Do the accesses past the 48 allocated bytes, but within the redone. */
1642         kasan_bitops_modify(test, BITS_PER_LONG, (void *)bits + 48);
1643         kasan_bitops_test_and_modify(test, BITS_PER_LONG + BITS_PER_BYTE, (void *)bits + 48);
1644 
1645         kfree(bits);
1646 }
1647 
1648 static void vmalloc_helpers_tags(struct kunit *test)
1649 {
1650         void *ptr;
1651 
1652         /* This test is intended for tag-based modes. */
1653         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1654 
1655         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_VMALLOC);
1656 
1657         if (!kasan_vmalloc_enabled())
1658                 kunit_skip(test, "Test requires kasan.vmalloc=on");
1659 
1660         ptr = vmalloc(PAGE_SIZE);
1661         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1662 
1663         /* Check that the returned pointer is tagged. */
1664         KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1665         KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1666 
1667         /* Make sure exported vmalloc helpers handle tagged pointers. */
1668         KUNIT_ASSERT_TRUE(test, is_vmalloc_addr(ptr));
1669         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vmalloc_to_page(ptr));
1670 
1671 #if !IS_MODULE(CONFIG_KASAN_KUNIT_TEST)
1672         {
1673                 int rv;
1674 
1675                 /* Make sure vmalloc'ed memory permissions can be changed. */
1676                 rv = set_memory_ro((unsigned long)ptr, 1);
1677                 KUNIT_ASSERT_GE(test, rv, 0);
1678                 rv = set_memory_rw((unsigned long)ptr, 1);
1679                 KUNIT_ASSERT_GE(test, rv, 0);
1680         }
1681 #endif
1682 
1683         vfree(ptr);
1684 }
1685 
1686 static void vmalloc_oob(struct kunit *test)
1687 {
1688         char *v_ptr, *p_ptr;
1689         struct page *page;
1690         size_t size = PAGE_SIZE / 2 - KASAN_GRANULE_SIZE - 5;
1691 
1692         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_VMALLOC);
1693 
1694         if (!kasan_vmalloc_enabled())
1695                 kunit_skip(test, "Test requires kasan.vmalloc=on");
1696 
1697         v_ptr = vmalloc(size);
1698         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, v_ptr);
1699 
1700         OPTIMIZER_HIDE_VAR(v_ptr);
1701 
1702         /*
1703          * We have to be careful not to hit the guard page in vmalloc tests.
1704          * The MMU will catch that and crash us.
1705          */
1706 
1707         /* Make sure in-bounds accesses are valid. */
1708         v_ptr[0] = 0;
1709         v_ptr[size - 1] = 0;
1710 
1711         /*
1712          * An unaligned access past the requested vmalloc size.
1713          * Only generic KASAN can precisely detect these.
1714          */
1715         if (IS_ENABLED(CONFIG_KASAN_GENERIC))
1716                 KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)v_ptr)[size]);
1717 
1718         /* An aligned access into the first out-of-bounds granule. */
1719         KUNIT_EXPECT_KASAN_FAIL(test, ((volatile char *)v_ptr)[size + 5]);
1720 
1721         /* Check that in-bounds accesses to the physical page are valid. */
1722         page = vmalloc_to_page(v_ptr);
1723         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, page);
1724         p_ptr = page_address(page);
1725         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p_ptr);
1726         p_ptr[0] = 0;
1727 
1728         vfree(v_ptr);
1729 
1730         /*
1731          * We can't check for use-after-unmap bugs in this nor in the following
1732          * vmalloc tests, as the page might be fully unmapped and accessing it
1733          * will crash the kernel.
1734          */
1735 }
1736 
1737 static void vmap_tags(struct kunit *test)
1738 {
1739         char *p_ptr, *v_ptr;
1740         struct page *p_page, *v_page;
1741 
1742         /*
1743          * This test is specifically crafted for the software tag-based mode,
1744          * the only tag-based mode that poisons vmap mappings.
1745          */
1746         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_SW_TAGS);
1747 
1748         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_VMALLOC);
1749 
1750         if (!kasan_vmalloc_enabled())
1751                 kunit_skip(test, "Test requires kasan.vmalloc=on");
1752 
1753         p_page = alloc_pages(GFP_KERNEL, 1);
1754         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p_page);
1755         p_ptr = page_address(p_page);
1756         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p_ptr);
1757 
1758         v_ptr = vmap(&p_page, 1, VM_MAP, PAGE_KERNEL);
1759         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, v_ptr);
1760 
1761         /*
1762          * We can't check for out-of-bounds bugs in this nor in the following
1763          * vmalloc tests, as allocations have page granularity and accessing
1764          * the guard page will crash the kernel.
1765          */
1766 
1767         KUNIT_EXPECT_GE(test, (u8)get_tag(v_ptr), (u8)KASAN_TAG_MIN);
1768         KUNIT_EXPECT_LT(test, (u8)get_tag(v_ptr), (u8)KASAN_TAG_KERNEL);
1769 
1770         /* Make sure that in-bounds accesses through both pointers work. */
1771         *p_ptr = 0;
1772         *v_ptr = 0;
1773 
1774         /* Make sure vmalloc_to_page() correctly recovers the page pointer. */
1775         v_page = vmalloc_to_page(v_ptr);
1776         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, v_page);
1777         KUNIT_EXPECT_PTR_EQ(test, p_page, v_page);
1778 
1779         vunmap(v_ptr);
1780         free_pages((unsigned long)p_ptr, 1);
1781 }
1782 
1783 static void vm_map_ram_tags(struct kunit *test)
1784 {
1785         char *p_ptr, *v_ptr;
1786         struct page *page;
1787 
1788         /*
1789          * This test is specifically crafted for the software tag-based mode,
1790          * the only tag-based mode that poisons vm_map_ram mappings.
1791          */
1792         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_KASAN_SW_TAGS);
1793 
1794         page = alloc_pages(GFP_KERNEL, 1);
1795         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, page);
1796         p_ptr = page_address(page);
1797         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p_ptr);
1798 
1799         v_ptr = vm_map_ram(&page, 1, -1);
1800         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, v_ptr);
1801 
1802         KUNIT_EXPECT_GE(test, (u8)get_tag(v_ptr), (u8)KASAN_TAG_MIN);
1803         KUNIT_EXPECT_LT(test, (u8)get_tag(v_ptr), (u8)KASAN_TAG_KERNEL);
1804 
1805         /* Make sure that in-bounds accesses through both pointers work. */
1806         *p_ptr = 0;
1807         *v_ptr = 0;
1808 
1809         vm_unmap_ram(v_ptr, 1);
1810         free_pages((unsigned long)p_ptr, 1);
1811 }
1812 
1813 /*
1814  * Check that the assigned pointer tag falls within the [KASAN_TAG_MIN,
1815  * KASAN_TAG_KERNEL) range (note: excluding the match-all tag) for tag-based
1816  * modes.
1817  */
1818 static void match_all_not_assigned(struct kunit *test)
1819 {
1820         char *ptr;
1821         struct page *pages;
1822         int i, size, order;
1823 
1824         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1825 
1826         for (i = 0; i < 256; i++) {
1827                 size = get_random_u32_inclusive(1, 1024);
1828                 ptr = kmalloc(size, GFP_KERNEL);
1829                 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1830                 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1831                 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1832                 kfree(ptr);
1833         }
1834 
1835         for (i = 0; i < 256; i++) {
1836                 order = get_random_u32_inclusive(1, 4);
1837                 pages = alloc_pages(GFP_KERNEL, order);
1838                 ptr = page_address(pages);
1839                 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1840                 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1841                 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1842                 free_pages((unsigned long)ptr, order);
1843         }
1844 
1845         if (!kasan_vmalloc_enabled())
1846                 return;
1847 
1848         for (i = 0; i < 256; i++) {
1849                 size = get_random_u32_inclusive(1, 1024);
1850                 ptr = vmalloc(size);
1851                 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1852                 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1853                 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1854                 vfree(ptr);
1855         }
1856 }
1857 
1858 /* Check that 0xff works as a match-all pointer tag for tag-based modes. */
1859 static void match_all_ptr_tag(struct kunit *test)
1860 {
1861         char *ptr;
1862         u8 tag;
1863 
1864         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1865 
1866         ptr = kmalloc(128, GFP_KERNEL);
1867         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1868 
1869         /* Backup the assigned tag. */
1870         tag = get_tag(ptr);
1871         KUNIT_EXPECT_NE(test, tag, (u8)KASAN_TAG_KERNEL);
1872 
1873         /* Reset the tag to 0xff.*/
1874         ptr = set_tag(ptr, KASAN_TAG_KERNEL);
1875 
1876         /* This access shouldn't trigger a KASAN report. */
1877         *ptr = 0;
1878 
1879         /* Recover the pointer tag and free. */
1880         ptr = set_tag(ptr, tag);
1881         kfree(ptr);
1882 }
1883 
1884 /* Check that there are no match-all memory tags for tag-based modes. */
1885 static void match_all_mem_tag(struct kunit *test)
1886 {
1887         char *ptr;
1888         int tag;
1889 
1890         KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1891 
1892         ptr = kmalloc(128, GFP_KERNEL);
1893         KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1894         KUNIT_EXPECT_NE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1895 
1896         /* For each possible tag value not matching the pointer tag. */
1897         for (tag = KASAN_TAG_MIN; tag <= KASAN_TAG_KERNEL; tag++) {
1898                 /*
1899                  * For Software Tag-Based KASAN, skip the majority of tag
1900                  * values to avoid the test printing too many reports.
1901                  */
1902                 if (IS_ENABLED(CONFIG_KASAN_SW_TAGS) &&
1903                     tag >= KASAN_TAG_MIN + 8 && tag <= KASAN_TAG_KERNEL - 8)
1904                         continue;
1905 
1906                 if (tag == get_tag(ptr))
1907                         continue;
1908 
1909                 /* Mark the first memory granule with the chosen memory tag. */
1910                 kasan_poison(ptr, KASAN_GRANULE_SIZE, (u8)tag, false);
1911 
1912                 /* This access must cause a KASAN report. */
1913                 KUNIT_EXPECT_KASAN_FAIL(test, *ptr = 0);
1914         }
1915 
1916         /* Recover the memory tag and free. */
1917         kasan_poison(ptr, KASAN_GRANULE_SIZE, get_tag(ptr), false);
1918         kfree(ptr);
1919 }
1920 
1921 /*
1922  * Check that Rust performing a use-after-free using `unsafe` is detected.
1923  * This is a smoke test to make sure that Rust is being sanitized properly.
1924  */
1925 static void rust_uaf(struct kunit *test)
1926 {
1927         KASAN_TEST_NEEDS_CONFIG_ON(test, CONFIG_RUST);
1928         KUNIT_EXPECT_KASAN_FAIL(test, kasan_test_rust_uaf());
1929 }
1930 
1931 static struct kunit_case kasan_kunit_test_cases[] = {
1932         KUNIT_CASE(kmalloc_oob_right),
1933         KUNIT_CASE(kmalloc_oob_left),
1934         KUNIT_CASE(kmalloc_node_oob_right),
1935         KUNIT_CASE(kmalloc_big_oob_right),
1936         KUNIT_CASE(kmalloc_large_oob_right),
1937         KUNIT_CASE(kmalloc_large_uaf),
1938         KUNIT_CASE(kmalloc_large_invalid_free),
1939         KUNIT_CASE(page_alloc_oob_right),
1940         KUNIT_CASE(page_alloc_uaf),
1941         KUNIT_CASE(krealloc_more_oob),
1942         KUNIT_CASE(krealloc_less_oob),
1943         KUNIT_CASE(krealloc_large_more_oob),
1944         KUNIT_CASE(krealloc_large_less_oob),
1945         KUNIT_CASE(krealloc_uaf),
1946         KUNIT_CASE(kmalloc_oob_16),
1947         KUNIT_CASE(kmalloc_uaf_16),
1948         KUNIT_CASE(kmalloc_oob_in_memset),
1949         KUNIT_CASE(kmalloc_oob_memset_2),
1950         KUNIT_CASE(kmalloc_oob_memset_4),
1951         KUNIT_CASE(kmalloc_oob_memset_8),
1952         KUNIT_CASE(kmalloc_oob_memset_16),
1953         KUNIT_CASE(kmalloc_memmove_negative_size),
1954         KUNIT_CASE(kmalloc_memmove_invalid_size),
1955         KUNIT_CASE(kmalloc_uaf),
1956         KUNIT_CASE(kmalloc_uaf_memset),
1957         KUNIT_CASE(kmalloc_uaf2),
1958         KUNIT_CASE(kmalloc_uaf3),
1959         KUNIT_CASE(kmalloc_double_kzfree),
1960         KUNIT_CASE(ksize_unpoisons_memory),
1961         KUNIT_CASE(ksize_uaf),
1962         KUNIT_CASE(rcu_uaf),
1963         KUNIT_CASE(workqueue_uaf),
1964         KUNIT_CASE(kfree_via_page),
1965         KUNIT_CASE(kfree_via_phys),
1966         KUNIT_CASE(kmem_cache_oob),
1967         KUNIT_CASE(kmem_cache_double_free),
1968         KUNIT_CASE(kmem_cache_invalid_free),
1969         KUNIT_CASE(kmem_cache_rcu_uaf),
1970         KUNIT_CASE(kmem_cache_double_destroy),
1971         KUNIT_CASE(kmem_cache_accounted),
1972         KUNIT_CASE(kmem_cache_bulk),
1973         KUNIT_CASE(mempool_kmalloc_oob_right),
1974         KUNIT_CASE(mempool_kmalloc_large_oob_right),
1975         KUNIT_CASE(mempool_slab_oob_right),
1976         KUNIT_CASE(mempool_kmalloc_uaf),
1977         KUNIT_CASE(mempool_kmalloc_large_uaf),
1978         KUNIT_CASE(mempool_slab_uaf),
1979         KUNIT_CASE(mempool_page_alloc_uaf),
1980         KUNIT_CASE(mempool_kmalloc_double_free),
1981         KUNIT_CASE(mempool_kmalloc_large_double_free),
1982         KUNIT_CASE(mempool_page_alloc_double_free),
1983         KUNIT_CASE(mempool_kmalloc_invalid_free),
1984         KUNIT_CASE(mempool_kmalloc_large_invalid_free),
1985         KUNIT_CASE(kasan_global_oob_right),
1986         KUNIT_CASE(kasan_global_oob_left),
1987         KUNIT_CASE(kasan_stack_oob),
1988         KUNIT_CASE(kasan_alloca_oob_left),
1989         KUNIT_CASE(kasan_alloca_oob_right),
1990         KUNIT_CASE(kasan_memchr),
1991         KUNIT_CASE(kasan_memcmp),
1992         KUNIT_CASE(kasan_strings),
1993         KUNIT_CASE(kasan_bitops_generic),
1994         KUNIT_CASE(kasan_bitops_tags),
1995         KUNIT_CASE(kasan_atomics),
1996         KUNIT_CASE(vmalloc_helpers_tags),
1997         KUNIT_CASE(vmalloc_oob),
1998         KUNIT_CASE(vmap_tags),
1999         KUNIT_CASE(vm_map_ram_tags),
2000         KUNIT_CASE(match_all_not_assigned),
2001         KUNIT_CASE(match_all_ptr_tag),
2002         KUNIT_CASE(match_all_mem_tag),
2003         KUNIT_CASE(rust_uaf),
2004         {}
2005 };
2006 
2007 static struct kunit_suite kasan_kunit_test_suite = {
2008         .name = "kasan",
2009         .test_cases = kasan_kunit_test_cases,
2010         .exit = kasan_test_exit,
2011         .suite_init = kasan_suite_init,
2012         .suite_exit = kasan_suite_exit,
2013 };
2014 
2015 kunit_test_suite(kasan_kunit_test_suite);
2016 
2017 MODULE_LICENSE("GPL");
2018 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php