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