Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
21bool 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
33bool 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
49FIXTURE(basic) {
50 FILE *maps;
51};
52
53FIXTURE_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
61FIXTURE_TEARDOWN(basic)
62{
63 if (self->maps)
64 fclose(self->maps);
65};
66
67FIXTURE_VARIANT(basic)
68{
69 char *name;
70 bool sealed;
71};
72
73FIXTURE_VARIANT_ADD(basic, vdso) {
74 .name = "[vdso]",
75 .sealed = true,
76};
77
78FIXTURE_VARIANT_ADD(basic, vvar) {
79 .name = "[vvar]",
80 .sealed = true,
81};
82
83FIXTURE_VARIANT_ADD(basic, vvar_vclock) {
84 .name = "[vvar_vclock]",
85 .sealed = true,
86};
87
88FIXTURE_VARIANT_ADD(basic, sigpage) {
89 .name = "[sigpage]",
90 .sealed = true,
91};
92
93FIXTURE_VARIANT_ADD(basic, vectors) {
94 .name = "[vectors]",
95 .sealed = true,
96};
97
98FIXTURE_VARIANT_ADD(basic, uprobes) {
99 .name = "[uprobes]",
100 .sealed = true,
101};
102
103FIXTURE_VARIANT_ADD(basic, stack) {
104 .name = "[stack]",
105 .sealed = false,
106};
107
108TEST_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
119TEST_HARNESS_MAIN