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