xref: /linux/kernel/tests/user_ns_map_kunit.c (revision 86cfbad9d7b3d2f6546dd3452aaade8022ac63ec)
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 = uid_gid_map_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 = uid_gid_map_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 = uid_gid_map_sort(&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