noaslr disable aslr for dragonflybsd. (#1364)

This commit is contained in:
David CARLIER 2023-07-13 13:11:09 +01:00 committed by GitHub
parent 1609960244
commit a95b322b1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 1 deletions

View File

@ -13,4 +13,6 @@ log = { version = "0.4.19", default-features = false }
nix = { version = "0.26.2", default-features = false, features = ["process", "personality"] } nix = { version = "0.26.2", default-features = false, features = ["process", "personality"] }
readonly = { version = "0.2.8", default-features = false } readonly = { version = "0.2.8", default-features = false }
simplelog = { version = "0.12.1", default-features = false } simplelog = { version = "0.12.1", default-features = false }
[target.'cfg(any(target_os = "freebsd", target_os = "dragonfly"))'.dependencies]
libc = "0.2" libc = "0.2"

View File

@ -8,6 +8,7 @@ use {
nix::unistd::execvp, nix::unistd::execvp,
std::ffi::CString, std::ffi::CString,
}; };
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
use { use {
crate::args::Args, crate::args::Args,
@ -28,7 +29,7 @@ fn disable_aslr() -> Result<()> {
Ok(()) Ok(())
} }
#[cfg(not(any(target_os = "linux", target_os = "android")))] #[cfg(target_os = "freebsd")]
fn disable_aslr() -> Result<()> { fn disable_aslr() -> Result<()> {
let mut status = libc::PROC_ASLR_FORCE_DISABLE; let mut status = libc::PROC_ASLR_FORCE_DISABLE;
let r = unsafe { let r = unsafe {
@ -45,6 +46,27 @@ fn disable_aslr() -> Result<()> {
Ok(()) Ok(())
} }
#[cfg(target_os = "dragonfly")]
fn disable_aslr() -> Result<()> {
unsafe {
let disable: i32 = 0;
let s = std::mem::size_of::<i32>();
let nm = CString::new("vm.randomize_mmap")
.map_err(|e| anyhow!("Failed to create sysctl oid: {e:}"))
.unwrap();
if libc::sysctlbyname(
nm.as_ptr(),
std::ptr::null_mut(),
std::ptr::null_mut(),
&disable as *const i32 as _,
s,
) < 0 {
return Err(anyhow!("Failed to disable aslr"));
}
}
Ok(())
}
fn main() -> Result<()> { fn main() -> Result<()> {
let args = Args::parse(); let args = Args::parse();