| #[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(); |
| } |
| } |