// SPDX-License-Identifier: GPL-2.0-only /* * test system mappings are sealed when * KCONFIG_MSEAL_SYSTEM_MAPPINGS=y */ #define _GNU_SOURCE #include #include #include #include #include #include "../kselftest.h" #include "../kselftest_harness.h" #define VMFLAGS "VmFlags:" #define MSEAL_FLAGS "sl" #define MAX_LINE_LEN 512 bool has_mapping(char *name, FILE *maps) { char line[MAX_LINE_LEN]; while (fgets(line, sizeof(line), maps)) { if (strstr(line, name)) return true; } return false; } bool mapping_is_sealed(char *name, FILE *maps) { char line[MAX_LINE_LEN]; while (fgets(line, sizeof(line), maps)) { if (!strncmp(line, VMFLAGS, strlen(VMFLAGS))) { if (strstr(line, MSEAL_FLAGS)) return true; return false; } } return false; } FIXTURE(basic) { FILE *maps; }; FIXTURE_SETUP(basic) { self->maps = fopen("/proc/self/smaps", "r"); if (!self->maps) SKIP(return, "Could not open /proc/self/smap, errno=%d", errno); }; FIXTURE_TEARDOWN(basic) { if (self->maps) fclose(self->maps); }; FIXTURE_VARIANT(basic) { char *name; bool sealed; }; FIXTURE_VARIANT_ADD(basic, vdso) { .name = "[vdso]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, vvar) { .name = "[vvar]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, vvar_vclock) { .name = "[vvar_vclock]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, sigpage) { .name = "[sigpage]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, vectors) { .name = "[vectors]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, uprobes) { .name = "[uprobes]", .sealed = true, }; FIXTURE_VARIANT_ADD(basic, stack) { .name = "[stack]", .sealed = false, }; TEST_F(basic, check_sealed) { if (!has_mapping(variant->name, self->maps)) { SKIP(return, "could not find the mapping, %s", variant->name); } EXPECT_EQ(variant->sealed, mapping_is_sealed(variant->name, self->maps)); }; TEST_HARNESS_MAIN