at master 119 lines 1.9 kB view raw
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