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