1#[cfg(target_os = "linux")]
2#[cfg(feature = "process")]
3mod test_prctl {
4 use std::ffi::CStr;
5
6 use nix::sys::prctl;
7
8 #[cfg_attr(qemu, ignore)]
9 #[test]
10 fn test_get_set_subreaper() {
11 let original = prctl::get_child_subreaper().unwrap();
12
13 prctl::set_child_subreaper(true).unwrap();
14 let subreaper = prctl::get_child_subreaper().unwrap();
15 assert!(subreaper);
16
17 prctl::set_child_subreaper(original).unwrap();
18 }
19
20 #[test]
21 fn test_get_set_dumpable() {
22 let original = prctl::get_dumpable().unwrap();
23
24 prctl::set_dumpable(false).unwrap();
25 let dumpable = prctl::get_dumpable().unwrap();
26 assert!(!dumpable);
27
28 prctl::set_dumpable(original).unwrap();
29 }
30
31 #[test]
32 fn test_get_set_keepcaps() {
33 let original = prctl::get_keepcaps().unwrap();
34
35 prctl::set_keepcaps(true).unwrap();
36 let keepcaps = prctl::get_keepcaps().unwrap();
37 assert!(keepcaps);
38
39 prctl::set_keepcaps(original).unwrap();
40 }
41
42 #[test]
43 fn test_get_set_clear_mce_kill() {
44 use prctl::PrctlMCEKillPolicy::*;
45
46 prctl::set_mce_kill(PR_MCE_KILL_LATE).unwrap();
47 let mce = prctl::get_mce_kill().unwrap();
48 assert_eq!(mce, PR_MCE_KILL_LATE);
49
50 prctl::clear_mce_kill().unwrap();
51 let mce = prctl::get_mce_kill().unwrap();
52 assert_eq!(mce, PR_MCE_KILL_DEFAULT);
53 }
54
55 #[cfg_attr(qemu, ignore)]
56 #[test]
57 fn test_get_set_pdeathsig() {
58 use nix::sys::signal::Signal;
59
60 let original = prctl::get_pdeathsig().unwrap();
61
62 prctl::set_pdeathsig(Signal::SIGUSR1).unwrap();
63 let sig = prctl::get_pdeathsig().unwrap();
64 assert_eq!(sig, Some(Signal::SIGUSR1));
65
66 prctl::set_pdeathsig(original).unwrap();
67 }
68
69 #[test]
70 fn test_get_set_name() {
71 let original = prctl::get_name().unwrap();
72
73 let long_name =
74 CStr::from_bytes_with_nul(b"0123456789abcdefghijklmn\0").unwrap();
75 prctl::set_name(long_name).unwrap();
76 let res = prctl::get_name().unwrap();
77
78 // name truncated by kernel to TASK_COMM_LEN
79 assert_eq!(&long_name.to_str().unwrap()[..15], res.to_str().unwrap());
80
81 let short_name = CStr::from_bytes_with_nul(b"01234567\0").unwrap();
82 prctl::set_name(short_name).unwrap();
83 let res = prctl::get_name().unwrap();
84 assert_eq!(short_name.to_str().unwrap(), res.to_str().unwrap());
85
86 prctl::set_name(&original).unwrap();
87 }
88
89 #[cfg_attr(qemu, ignore)]
90 #[test]
91 fn test_get_set_timerslack() {
92 let original = prctl::get_timerslack().unwrap();
93
94 let slack = 60_000;
95 prctl::set_timerslack(slack).unwrap();
96 let res = prctl::get_timerslack().unwrap();
97 assert_eq!(slack, res as u64);
98
99 prctl::set_timerslack(original as u64).unwrap();
100 }
101
102 #[test]
103 fn test_disable_enable_perf_events() {
104 prctl::task_perf_events_disable().unwrap();
105 prctl::task_perf_events_enable().unwrap();
106 }
107
108 #[test]
109 fn test_get_set_no_new_privs() {
110 prctl::set_no_new_privs().unwrap();
111 let no_new_privs = prctl::get_no_new_privs().unwrap();
112 assert!(no_new_privs);
113 }
114
115 #[test]
116 fn test_get_set_thp_disable() {
117 let original = prctl::get_thp_disable().unwrap();
118
119 prctl::set_thp_disable(true).unwrap();
120 let thp_disable = prctl::get_thp_disable().unwrap();
121 assert!(thp_disable);
122
123 prctl::set_thp_disable(original).unwrap();
124 }
125}
126