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