xref: /linux/kernel/tests/user_ns_map_kunit.c (revision e86d265826b8dc54178e16c4027d3bd5d0299f12)
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 
user_ns_map_insert(struct kunit * test)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 
user_ns_map_insert_extended(struct kunit * test)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