#[derive(Debug, Clone, PartialEq, Eq)]
#[derive(Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub enum PermittedSyscalls
{
Allow(IndexSet<SYS>),
Disallow
{
known: IndexSet<SYS>,
undefined: Vec<Range<u32>>,
},
}
impl Default for PermittedSyscalls
{
#[inline(always)]
fn default() -> Self
{
use self::SYS::*;
PermittedSyscalls::Disallow
{
undefined: SYS::Undefined.to_vec(),
known: indexset!
{
acct,
add_key,
bpf,
clock_adjtime,
clock_settime,
clone,
create_module,
delete_module,
finit_module,
get_kernel_syms,
init_module,
ioperm,
iopl,
kcmp,
kexec_load,
kexec_file_load,
keyctl,
lookup_dcookie,
mount,
name_to_handle_at,
nfsservctl,
open_by_handle_at,
perf_event_open,
personality,
pivot_root,
process_vm_readv,
process_vm_writev,
ptrace,
query_module,
quotactl,
reboot,
request_key,
setns,
settimeofday,
swapon,
swapoff,
sysfs,
_sysctl,
umount2,
unshare,
uselib,
userfaultfd,
ustat,
}
}
}
}
impl PermittedSyscalls
{
#[inline(always)]
pub fn seccomp_program(&self) -> SeccompProgram
{
use self::AuditArchitecture::*;
let architecture = if cfg!(target_arch = "aarch64")
{
AARCH64
}
else if cfg!(target_arch = "mips64")
{
if cfg!(target_endian = "little")
{
MIPSEL64
}
else
{
MIPS64
}
}
else if cfg!(target_arch = "powerpc64")
{
if cfg!(target_endian = "little")
{
PPC64LE
}
else
{
PPC64
}
}
else if cfg!(target_arch = "riscv64")
{
RISCV64
}
else if cfg!(target_arch = "s390x")
{
S390X
}
else if cfg!(target_arch = "sparc64")
{
SPARC64
}
else if cfg!(target_arch = "x86_64")
{
X86_64
}
else
{
unimplemented!("Unsupported target_arch")
};
let mut seccomp_program = SeccompProgram::default();
seccomp_program.validate_syscall_architecture(architecture);
use self::PermittedSyscalls::*;
match self
{
&Allow(ref known) =>
{
if known.len() <= 256
{
seccomp_program.allow_only_these_syscalls_256_or_fewer(known)
}
else
{
seccomp_program.allow_only_these_syscalls(known)
}
}
&Disallow { ref known, ref undefined } =>
{
if known.len() <= 256
{
seccomp_program.disallow_only_these_syscalls_256_or_fewer(known, undefined)
}
else
{
seccomp_program.disallow_only_these_syscalls(known, undefined)
}
},
}
seccomp_program
}
}