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
user_ns_map_insert(struct kunit * test)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
user_ns_map_insert_extended(struct kunit * test)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