1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * KUnit test for user namespace map insertion and sorting. 4 */ 5 6 #define pr_fmt(fmt) "user_namespace: " fmt 7 8 #include <kunit/test.h> 9 #include <linux/user_namespace.h> 10 11 #define NR_EXTENTS (UID_GID_MAP_MAX_BASE_EXTENTS + 5) 12 13 static void user_ns_map_insert(struct kunit *test) 14 { 15 struct uid_gid_map map; 16 struct uid_gid_extent extent; 17 int i, ret; 18 19 memset(&map, 0, sizeof(map)); 20 21 /* Insert up to UID_GID_MAP_MAX_BASE_EXTENTS elements */ 22 for (i = 0; i < UID_GID_MAP_MAX_BASE_EXTENTS; i++) { 23 extent.first = i * 10; 24 extent.lower_first = i * 100; 25 extent.count = 5; 26 27 ret = insert_extent(&map, &extent); 28 KUNIT_ASSERT_EQ(test, ret, 0); 29 } 30 31 KUNIT_EXPECT_EQ(test, map.nr_extents, UID_GID_MAP_MAX_BASE_EXTENTS); 32 33 /* Verify the elements ended up in the 'extent' array */ 34 for (i = 0; i < UID_GID_MAP_MAX_BASE_EXTENTS; i++) { 35 KUNIT_EXPECT_EQ(test, map.extent[i].first, i * 10); 36 KUNIT_EXPECT_EQ(test, map.extent[i].lower_first, i * 100); 37 KUNIT_EXPECT_EQ(test, map.extent[i].count, 5); 38 } 39 } 40 41 static void user_ns_map_insert_extended(struct kunit *test) 42 { 43 struct uid_gid_map map; 44 struct uid_gid_extent extent; 45 int i, ret; 46 47 memset(&map, 0, sizeof(map)); 48 49 /* Insert more than UID_GID_MAP_MAX_BASE_EXTENTS elements */ 50 for (i = 0; i < NR_EXTENTS; i++) { 51 int value = 9 - i; 52 53 extent.first = value * 10; 54 extent.lower_first = value * 100; 55 extent.count = 5; 56 57 ret = insert_extent(&map, &extent); 58 KUNIT_ASSERT_EQ(test, ret, 0); 59 } 60 61 KUNIT_EXPECT_EQ(test, map.nr_extents, NR_EXTENTS); 62 63 /* Now sort the map to set up reverse mapping */ 64 ret = sort_idmaps(&map); 65 KUNIT_ASSERT_EQ(test, ret, 0); 66 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, map.reverse); 67 68 /* Verify the elements are in 'forward' and that sorting is correct */ 69 for (i = 0; i < map.nr_extents; i++) { 70 KUNIT_EXPECT_EQ(test, map.forward[i].first, i * 10); 71 KUNIT_EXPECT_EQ(test, map.forward[i].lower_first, i * 100); 72 KUNIT_EXPECT_EQ(test, map.forward[i].count, 5); 73 74 KUNIT_EXPECT_EQ(test, map.reverse[i].first, i * 10); 75 KUNIT_EXPECT_EQ(test, map.reverse[i].lower_first, i * 100); 76 KUNIT_EXPECT_EQ(test, map.reverse[i].count, 5); 77 } 78 79 kfree(map.forward); 80 kfree(map.reverse); 81 } 82 83 static struct kunit_case user_ns_map_test_cases[] = { 84 KUNIT_CASE(user_ns_map_insert), 85 KUNIT_CASE(user_ns_map_insert_extended), 86 {} 87 }; 88 89 static struct kunit_suite user_ns_map_test_suite = { 90 .name = "user_ns_map", 91 .test_cases = user_ns_map_test_cases, 92 }; 93 94 kunit_test_suite(user_ns_map_test_suite); 95 96 MODULE_LICENSE("GPL"); 97 MODULE_DESCRIPTION("KUnit test for user namespace map insertion"); 98 MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING"); 99