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 
has_mapping(char * name,FILE * maps)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 
mapping_is_sealed(char * name,FILE * maps)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 
FIXTURE(basic)49 FIXTURE(basic) {
50 	FILE *maps;
51 };
52 
FIXTURE_SETUP(basic)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 
FIXTURE_TEARDOWN(basic)61 FIXTURE_TEARDOWN(basic)
62 {
63 	if (self->maps)
64 		fclose(self->maps);
65 };
66 
FIXTURE_VARIANT(basic)67 FIXTURE_VARIANT(basic)
68 {
69 	char *name;
70 	bool sealed;
71 };
72 
FIXTURE_VARIANT_ADD(basic,vdso)73 FIXTURE_VARIANT_ADD(basic, vdso) {
74 	.name = "[vdso]",
75 	.sealed = true,
76 };
77 
FIXTURE_VARIANT_ADD(basic,vvar)78 FIXTURE_VARIANT_ADD(basic, vvar) {
79 	.name = "[vvar]",
80 	.sealed = true,
81 };
82 
FIXTURE_VARIANT_ADD(basic,vvar_vclock)83 FIXTURE_VARIANT_ADD(basic, vvar_vclock) {
84 	.name = "[vvar_vclock]",
85 	.sealed = true,
86 };
87 
FIXTURE_VARIANT_ADD(basic,sigpage)88 FIXTURE_VARIANT_ADD(basic, sigpage) {
89 	.name = "[sigpage]",
90 	.sealed = true,
91 };
92 
FIXTURE_VARIANT_ADD(basic,vectors)93 FIXTURE_VARIANT_ADD(basic, vectors) {
94 	.name = "[vectors]",
95 	.sealed = true,
96 };
97 
FIXTURE_VARIANT_ADD(basic,uprobes)98 FIXTURE_VARIANT_ADD(basic, uprobes) {
99 	.name = "[uprobes]",
100 	.sealed = true,
101 };
102 
FIXTURE_VARIANT_ADD(basic,stack)103 FIXTURE_VARIANT_ADD(basic, stack) {
104 	.name = "[stack]",
105 	.sealed = false,
106 };
107 
TEST_F(basic,check_sealed)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