xref: /linux/kernel/tests/user_ns_map_kunit.c (revision f6f1a2496ba5dcc076d7fb7aa329887cd6ae55fa)
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