159 lines
4.4 KiB
Rust
159 lines
4.4 KiB
Rust
#[cfg(target_os = "linux")]
|
|
#[cfg(feature = "process")]
|
|
mod test_prctl {
|
|
use std::ffi::CStr;
|
|
|
|
use nix::sys::prctl;
|
|
|
|
#[cfg_attr(qemu, ignore)]
|
|
#[test]
|
|
fn test_get_set_subreaper() {
|
|
let original = prctl::get_child_subreaper().unwrap();
|
|
|
|
prctl::set_child_subreaper(true).unwrap();
|
|
let subreaper = prctl::get_child_subreaper().unwrap();
|
|
assert!(subreaper);
|
|
|
|
prctl::set_child_subreaper(original).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_dumpable() {
|
|
let original = prctl::get_dumpable().unwrap();
|
|
|
|
prctl::set_dumpable(false).unwrap();
|
|
let dumpable = prctl::get_dumpable().unwrap();
|
|
assert!(!dumpable);
|
|
|
|
prctl::set_dumpable(original).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_keepcaps() {
|
|
let original = prctl::get_keepcaps().unwrap();
|
|
|
|
prctl::set_keepcaps(true).unwrap();
|
|
let keepcaps = prctl::get_keepcaps().unwrap();
|
|
assert!(keepcaps);
|
|
|
|
prctl::set_keepcaps(original).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_clear_mce_kill() {
|
|
use prctl::PrctlMCEKillPolicy::*;
|
|
|
|
prctl::set_mce_kill(PR_MCE_KILL_LATE).unwrap();
|
|
let mce = prctl::get_mce_kill().unwrap();
|
|
assert_eq!(mce, PR_MCE_KILL_LATE);
|
|
|
|
prctl::clear_mce_kill().unwrap();
|
|
let mce = prctl::get_mce_kill().unwrap();
|
|
assert_eq!(mce, PR_MCE_KILL_DEFAULT);
|
|
}
|
|
|
|
#[cfg_attr(qemu, ignore)]
|
|
#[test]
|
|
fn test_get_set_pdeathsig() {
|
|
use nix::sys::signal::Signal;
|
|
|
|
let original = prctl::get_pdeathsig().unwrap();
|
|
|
|
prctl::set_pdeathsig(Signal::SIGUSR1).unwrap();
|
|
let sig = prctl::get_pdeathsig().unwrap();
|
|
assert_eq!(sig, Some(Signal::SIGUSR1));
|
|
|
|
prctl::set_pdeathsig(original).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_name() {
|
|
let original = prctl::get_name().unwrap();
|
|
|
|
let long_name =
|
|
CStr::from_bytes_with_nul(b"0123456789abcdefghijklmn\0").unwrap();
|
|
prctl::set_name(long_name).unwrap();
|
|
let res = prctl::get_name().unwrap();
|
|
|
|
// name truncated by kernel to TASK_COMM_LEN
|
|
assert_eq!(&long_name.to_str().unwrap()[..15], res.to_str().unwrap());
|
|
|
|
let short_name = CStr::from_bytes_with_nul(b"01234567\0").unwrap();
|
|
prctl::set_name(short_name).unwrap();
|
|
let res = prctl::get_name().unwrap();
|
|
assert_eq!(short_name.to_str().unwrap(), res.to_str().unwrap());
|
|
|
|
prctl::set_name(&original).unwrap();
|
|
}
|
|
|
|
#[cfg_attr(qemu, ignore)]
|
|
#[test]
|
|
fn test_get_set_timerslack() {
|
|
let original = prctl::get_timerslack().unwrap();
|
|
|
|
let slack = 60_000;
|
|
prctl::set_timerslack(slack).unwrap();
|
|
let res = prctl::get_timerslack().unwrap();
|
|
assert_eq!(slack, res as u64);
|
|
|
|
prctl::set_timerslack(original as u64).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_disable_enable_perf_events() {
|
|
prctl::task_perf_events_disable().unwrap();
|
|
prctl::task_perf_events_enable().unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_no_new_privs() {
|
|
prctl::set_no_new_privs().unwrap();
|
|
let no_new_privs = prctl::get_no_new_privs().unwrap();
|
|
assert!(no_new_privs);
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_set_thp_disable() {
|
|
let original = prctl::get_thp_disable().unwrap();
|
|
|
|
prctl::set_thp_disable(true).unwrap();
|
|
let thp_disable = prctl::get_thp_disable().unwrap();
|
|
assert!(thp_disable);
|
|
|
|
prctl::set_thp_disable(original).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_set_vma_anon_name() {
|
|
use nix::errno::Errno;
|
|
use nix::sys::mman;
|
|
use std::num::NonZeroUsize;
|
|
|
|
const ONE_K: libc::size_t = 1024;
|
|
let sz = NonZeroUsize::new(ONE_K).unwrap();
|
|
let ptr = unsafe {
|
|
mman::mmap_anonymous(
|
|
None,
|
|
sz,
|
|
mman::ProtFlags::PROT_READ,
|
|
mman::MapFlags::MAP_SHARED,
|
|
)
|
|
.unwrap()
|
|
};
|
|
let err = prctl::set_vma_anon_name(
|
|
ptr,
|
|
sz,
|
|
Some(CStr::from_bytes_with_nul(b"[,$\0").unwrap()),
|
|
)
|
|
.unwrap_err();
|
|
assert_eq!(err, Errno::EINVAL);
|
|
// `CONFIG_ANON_VMA_NAME` kernel config might not be set
|
|
prctl::set_vma_anon_name(
|
|
ptr,
|
|
sz,
|
|
Some(CStr::from_bytes_with_nul(b"Nix\0").unwrap()),
|
|
)
|
|
.unwrap_or_default();
|
|
prctl::set_vma_anon_name(ptr, sz, None).unwrap_or_default();
|
|
}
|
|
}
|