#[cfg(unix)]
pub fn restrict_new_file_permissions() -> u32 {
let previous = unsafe { libc::umask(0o077) };
previous as u32
}
#[cfg(not(unix))]
pub fn restrict_new_file_permissions() -> u32 {
0
}
#[cfg(all(test, unix))]
mod tests {
use std::os::unix::fs::PermissionsExt;
#[test]
fn new_files_are_owner_only_after_restricting_the_umask() {
let previous = super::restrict_new_file_permissions();
let dir = std::env::temp_dir().join(format!("reddb-umask-{}", std::process::id()));
std::fs::create_dir_all(&dir).expect("temp dir");
let path = dir.join("durable.rdb");
std::fs::write(&path, b"rows").expect("write");
let mode = std::fs::metadata(&path).expect("stat").permissions().mode() & 0o777;
unsafe { libc::umask(previous as libc::mode_t) };
let _ = std::fs::remove_dir_all(&dir);
assert_eq!(
mode, 0o600,
"a file created after restricting the umask must not be group- or world-readable"
);
}
}