147 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Linux Security Module infrastructure tests4 * Tests for the lsm_list_modules system call5 *6 * Copyright © 2022 Casey Schaufler <casey@schaufler-ca.com>7 */8 9#define _GNU_SOURCE10#include <linux/lsm.h>11#include <string.h>12#include <stdio.h>13#include <unistd.h>14#include <sys/types.h>15#include "../kselftest_harness.h"16#include "common.h"17 18TEST(size_null_lsm_list_modules)19{20 const long page_size = sysconf(_SC_PAGESIZE);21 __u64 *syscall_lsms = calloc(page_size, 1);22 23 ASSERT_NE(NULL, syscall_lsms);24 errno = 0;25 ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, NULL, 0));26 ASSERT_EQ(EFAULT, errno);27 28 free(syscall_lsms);29}30 31TEST(ids_null_lsm_list_modules)32{33 const long page_size = sysconf(_SC_PAGESIZE);34 __u32 size = page_size;35 36 errno = 0;37 ASSERT_EQ(-1, lsm_list_modules(NULL, &size, 0));38 ASSERT_EQ(EFAULT, errno);39 ASSERT_NE(1, size);40}41 42TEST(size_too_small_lsm_list_modules)43{44 const long page_size = sysconf(_SC_PAGESIZE);45 __u64 *syscall_lsms = calloc(page_size, 1);46 __u32 size = 1;47 48 ASSERT_NE(NULL, syscall_lsms);49 errno = 0;50 ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, &size, 0));51 ASSERT_EQ(E2BIG, errno);52 ASSERT_NE(1, size);53 54 free(syscall_lsms);55}56 57TEST(flags_set_lsm_list_modules)58{59 const long page_size = sysconf(_SC_PAGESIZE);60 __u64 *syscall_lsms = calloc(page_size, 1);61 __u32 size = page_size;62 63 ASSERT_NE(NULL, syscall_lsms);64 errno = 0;65 ASSERT_EQ(-1, lsm_list_modules(syscall_lsms, &size, 7));66 ASSERT_EQ(EINVAL, errno);67 ASSERT_EQ(page_size, size);68 69 free(syscall_lsms);70}71 72TEST(correct_lsm_list_modules)73{74 const long page_size = sysconf(_SC_PAGESIZE);75 __u32 size = page_size;76 __u64 *syscall_lsms = calloc(page_size, 1);77 char *sysfs_lsms = calloc(page_size, 1);78 char *name;79 char *cp;80 int count;81 int i;82 83 ASSERT_NE(NULL, sysfs_lsms);84 ASSERT_NE(NULL, syscall_lsms);85 ASSERT_EQ(0, read_sysfs_lsms(sysfs_lsms, page_size));86 87 count = lsm_list_modules(syscall_lsms, &size, 0);88 ASSERT_LE(1, count);89 cp = sysfs_lsms;90 for (i = 0; i < count; i++) {91 switch (syscall_lsms[i]) {92 case LSM_ID_CAPABILITY:93 name = "capability";94 break;95 case LSM_ID_SELINUX:96 name = "selinux";97 break;98 case LSM_ID_SMACK:99 name = "smack";100 break;101 case LSM_ID_TOMOYO:102 name = "tomoyo";103 break;104 case LSM_ID_APPARMOR:105 name = "apparmor";106 break;107 case LSM_ID_YAMA:108 name = "yama";109 break;110 case LSM_ID_LOADPIN:111 name = "loadpin";112 break;113 case LSM_ID_SAFESETID:114 name = "safesetid";115 break;116 case LSM_ID_LOCKDOWN:117 name = "lockdown";118 break;119 case LSM_ID_BPF:120 name = "bpf";121 break;122 case LSM_ID_LANDLOCK:123 name = "landlock";124 break;125 case LSM_ID_IMA:126 name = "ima";127 break;128 case LSM_ID_EVM:129 name = "evm";130 break;131 case LSM_ID_IPE:132 name = "ipe";133 break;134 default:135 name = "INVALID";136 break;137 }138 ASSERT_EQ(0, strncmp(cp, name, strlen(name)));139 cp += strlen(name) + 1;140 }141 142 free(sysfs_lsms);143 free(syscall_lsms);144}145 146TEST_HARNESS_MAIN147