xref: /linux/tools/testing/selftests/mseal_system_mappings/sysmap_is_sealed.c (revision 7a9b709e7cc5ce1ffb84ce07bf6d157e1de758df)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * test system mappings are sealed when
4  * KCONFIG_MSEAL_SYSTEM_MAPPINGS=y
5  */
6 
7 #define _GNU_SOURCE
8 #include <stdio.h>
9 #include <errno.h>
10 #include <unistd.h>
11 #include <string.h>
12 #include <stdbool.h>
13 
14 #include "../kselftest.h"
15 #include "../kselftest_harness.h"
16 
17 #define VMFLAGS "VmFlags:"
18 #define MSEAL_FLAGS "sl"
19 #define MAX_LINE_LEN 512
20 
21 bool has_mapping(char *name, FILE *maps)
22 {
23 	char line[MAX_LINE_LEN];
24 
25 	while (fgets(line, sizeof(line), maps)) {
26 		if (strstr(line, name))
27 			return true;
28 	}
29 
30 	return false;
31 }
32 
33 bool mapping_is_sealed(char *name, FILE *maps)
34 {
35 	char line[MAX_LINE_LEN];
36 
37 	while (fgets(line, sizeof(line), maps)) {
38 		if (!strncmp(line, VMFLAGS, strlen(VMFLAGS))) {
39 			if (strstr(line, MSEAL_FLAGS))
40 				return true;
41 
42 			return false;
43 		}
44 	}
45 
46 	return false;
47 }
48 
49 FIXTURE(basic) {
50 	FILE *maps;
51 };
52 
53 FIXTURE_SETUP(basic)
54 {
55 	self->maps = fopen("/proc/self/smaps", "r");
56 	if (!self->maps)
57 		SKIP(return, "Could not open /proc/self/smap, errno=%d",
58 			errno);
59 };
60 
61 FIXTURE_TEARDOWN(basic)
62 {
63 	if (self->maps)
64 		fclose(self->maps);
65 };
66 
67 FIXTURE_VARIANT(basic)
68 {
69 	char *name;
70 	bool sealed;
71 };
72 
73 FIXTURE_VARIANT_ADD(basic, vdso) {
74 	.name = "[vdso]",
75 	.sealed = true,
76 };
77 
78 FIXTURE_VARIANT_ADD(basic, vvar) {
79 	.name = "[vvar]",
80 	.sealed = true,
81 };
82 
83 FIXTURE_VARIANT_ADD(basic, vvar_vclock) {
84 	.name = "[vvar_vclock]",
85 	.sealed = true,
86 };
87 
88 FIXTURE_VARIANT_ADD(basic, sigpage) {
89 	.name = "[sigpage]",
90 	.sealed = true,
91 };
92 
93 FIXTURE_VARIANT_ADD(basic, vectors) {
94 	.name = "[vectors]",
95 	.sealed = true,
96 };
97 
98 FIXTURE_VARIANT_ADD(basic, uprobes) {
99 	.name = "[uprobes]",
100 	.sealed = true,
101 };
102 
103 FIXTURE_VARIANT_ADD(basic, stack) {
104 	.name = "[stack]",
105 	.sealed = false,
106 };
107 
108 TEST_F(basic, check_sealed)
109 {
110 	if (!has_mapping(variant->name, self->maps)) {
111 		SKIP(return, "could not find the mapping, %s",
112 			variant->name);
113 	}
114 
115 	EXPECT_EQ(variant->sealed,
116 		mapping_is_sealed(variant->name, self->maps));
117 };
118 
119 TEST_HARNESS_MAIN
120