kasan_test.c (81895a65ec63ee1daec3255dc1a06675d2fbe915) kasan_test.c (d6e5040bd8e53371fafd7e0c7c63b090b3a675db)
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#include <linux/bitops.h>

--- 281 unchanged lines hidden (view full) ---

290 middle = size1 + (size2 - size1) / 2;
291
292 ptr1 = kmalloc(size1, GFP_KERNEL);
293 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
294
295 ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
296 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
297
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#include <linux/bitops.h>

--- 281 unchanged lines hidden (view full) ---

290 middle = size1 + (size2 - size1) / 2;
291
292 ptr1 = kmalloc(size1, GFP_KERNEL);
293 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
294
295 ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
296 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
297
298 /* Suppress -Warray-bounds warnings. */
299 OPTIMIZER_HIDE_VAR(ptr2);
300
298 /* All offsets up to size2 must be accessible. */
299 ptr2[size1 - 1] = 'x';
300 ptr2[size1] = 'x';
301 ptr2[middle] = 'x';
302 ptr2[size2 - 1] = 'x';
303
304 /* Generic mode is precise, so unaligned size2 must be inaccessible. */
305 if (IS_ENABLED(CONFIG_KASAN_GENERIC))

--- 16 unchanged lines hidden (view full) ---

322 middle = size2 + (size1 - size2) / 2;
323
324 ptr1 = kmalloc(size1, GFP_KERNEL);
325 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
326
327 ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
328 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
329
301 /* All offsets up to size2 must be accessible. */
302 ptr2[size1 - 1] = 'x';
303 ptr2[size1] = 'x';
304 ptr2[middle] = 'x';
305 ptr2[size2 - 1] = 'x';
306
307 /* Generic mode is precise, so unaligned size2 must be inaccessible. */
308 if (IS_ENABLED(CONFIG_KASAN_GENERIC))

--- 16 unchanged lines hidden (view full) ---

325 middle = size2 + (size1 - size2) / 2;
326
327 ptr1 = kmalloc(size1, GFP_KERNEL);
328 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr1);
329
330 ptr2 = krealloc(ptr1, size2, GFP_KERNEL);
331 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2);
332
333 /* Suppress -Warray-bounds warnings. */
334 OPTIMIZER_HIDE_VAR(ptr2);
335
330 /* Must be accessible for all modes. */
331 ptr2[size2 - 1] = 'x';
332
333 /* Generic mode is precise, so unaligned size2 must be inaccessible. */
334 if (IS_ENABLED(CONFIG_KASAN_GENERIC))
335 KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size2] = 'x');
336
337 /* For all modes first aligned offset after size2 must be inaccessible. */

--- 197 unchanged lines hidden (view full) ---

535 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
536 kfree(ptr);
537}
538
539static void kmalloc_memmove_invalid_size(struct kunit *test)
540{
541 char *ptr;
542 size_t size = 64;
336 /* Must be accessible for all modes. */
337 ptr2[size2 - 1] = 'x';
338
339 /* Generic mode is precise, so unaligned size2 must be inaccessible. */
340 if (IS_ENABLED(CONFIG_KASAN_GENERIC))
341 KUNIT_EXPECT_KASAN_FAIL(test, ptr2[size2] = 'x');
342
343 /* For all modes first aligned offset after size2 must be inaccessible. */

--- 197 unchanged lines hidden (view full) ---

541 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
542 kfree(ptr);
543}
544
545static void kmalloc_memmove_invalid_size(struct kunit *test)
546{
547 char *ptr;
548 size_t size = 64;
543 volatile size_t invalid_size = size;
549 size_t invalid_size = size;
544
545 ptr = kmalloc(size, GFP_KERNEL);
546 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
547
548 memset((char *)ptr, 0, 64);
549 OPTIMIZER_HIDE_VAR(ptr);
550
551 ptr = kmalloc(size, GFP_KERNEL);
552 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
553
554 memset((char *)ptr, 0, 64);
555 OPTIMIZER_HIDE_VAR(ptr);
556 OPTIMIZER_HIDE_VAR(invalid_size);
550 KUNIT_EXPECT_KASAN_FAIL(test,
551 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
552 kfree(ptr);
553}
554
555static void kmalloc_uaf(struct kunit *test)
556{
557 char *ptr;

--- 729 unchanged lines hidden (view full) ---

1287{
1288 char *ptr;
1289 struct page *pages;
1290 int i, size, order;
1291
1292 KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1293
1294 for (i = 0; i < 256; i++) {
557 KUNIT_EXPECT_KASAN_FAIL(test,
558 memmove((char *)ptr, (char *)ptr + 4, invalid_size));
559 kfree(ptr);
560}
561
562static void kmalloc_uaf(struct kunit *test)
563{
564 char *ptr;

--- 729 unchanged lines hidden (view full) ---

1294{
1295 char *ptr;
1296 struct page *pages;
1297 int i, size, order;
1298
1299 KASAN_TEST_NEEDS_CONFIG_OFF(test, CONFIG_KASAN_GENERIC);
1300
1301 for (i = 0; i < 256; i++) {
1295 size = prandom_u32_max(1024) + 1;
1302 size = (get_random_int() % 1024) + 1;
1296 ptr = kmalloc(size, GFP_KERNEL);
1297 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1298 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1299 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1300 kfree(ptr);
1301 }
1302
1303 for (i = 0; i < 256; i++) {
1303 ptr = kmalloc(size, GFP_KERNEL);
1304 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1305 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1306 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1307 kfree(ptr);
1308 }
1309
1310 for (i = 0; i < 256; i++) {
1304 order = prandom_u32_max(4) + 1;
1311 order = (get_random_int() % 4) + 1;
1305 pages = alloc_pages(GFP_KERNEL, order);
1306 ptr = page_address(pages);
1307 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1308 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1309 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1310 free_pages((unsigned long)ptr, order);
1311 }
1312
1313 if (!IS_ENABLED(CONFIG_KASAN_VMALLOC))
1314 return;
1315
1316 for (i = 0; i < 256; i++) {
1312 pages = alloc_pages(GFP_KERNEL, order);
1313 ptr = page_address(pages);
1314 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1315 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1316 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1317 free_pages((unsigned long)ptr, order);
1318 }
1319
1320 if (!IS_ENABLED(CONFIG_KASAN_VMALLOC))
1321 return;
1322
1323 for (i = 0; i < 256; i++) {
1317 size = prandom_u32_max(1024) + 1;
1324 size = (get_random_int() % 1024) + 1;
1318 ptr = vmalloc(size);
1319 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1320 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1321 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1322 vfree(ptr);
1323 }
1324}
1325

--- 125 unchanged lines hidden ---
1325 ptr = vmalloc(size);
1326 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr);
1327 KUNIT_EXPECT_GE(test, (u8)get_tag(ptr), (u8)KASAN_TAG_MIN);
1328 KUNIT_EXPECT_LT(test, (u8)get_tag(ptr), (u8)KASAN_TAG_KERNEL);
1329 vfree(ptr);
1330 }
1331}
1332

--- 125 unchanged lines hidden ---