pub fn set_non_dumpable() {
#[cfg(target_os = "linux")]
unsafe {
let _ = libc::prctl(libc::PR_SET_DUMPABLE, 0);
}
#[cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))]
unsafe {
#[cfg(target_os = "freebsd")]
{
let mut ctl: libc::c_int = libc::PROC_TRACE_CTL_DISABLE;
let _ = libc::procctl(
libc::P_PID,
0,
libc::PROC_TRACE_CTL,
&mut ctl as *mut libc::c_int as *mut libc::c_void,
);
}
let lim = libc::rlimit {
rlim_cur: 0,
rlim_max: 0,
};
let _ = libc::setrlimit(libc::RLIMIT_CORE, &lim);
}
}
#[cfg(test)]
mod tests {
#[cfg(target_os = "linux")]
#[test]
fn set_non_dumpable_clears_dumpable_flag() {
super::set_non_dumpable();
let d = unsafe { libc::prctl(libc::PR_GET_DUMPABLE) };
assert_eq!(d, 0, "PR_SET_DUMPABLE(0) should leave dumpable == 0");
}
#[cfg(target_os = "freebsd")]
#[test]
fn set_non_dumpable_disables_trace_on_freebsd() {
super::set_non_dumpable();
let mut status: libc::c_int = 0;
unsafe {
libc::procctl(
libc::P_PID,
0,
libc::PROC_TRACE_STATUS,
&mut status as *mut libc::c_int as *mut libc::c_void,
);
}
assert_eq!(status, -1); }
#[cfg(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))]
#[test]
fn set_non_dumpable_zeros_core_limit_on_bsd() {
super::set_non_dumpable();
let mut lim = unsafe { std::mem::zeroed::<libc::rlimit>() };
unsafe {
libc::getrlimit(libc::RLIMIT_CORE, &mut lim);
}
assert_eq!(lim.rlim_cur, 0); }
}