Skip to content

Commit

Permalink
std::thread update freensd stack guard handling.
Browse files Browse the repository at this point in the history
up to now, it had been assumed the stack guard setting default is not
touched in the field but some user might just want to disable it or
increase it. checking it once at runtime should be enough.
  • Loading branch information
devnexen committed Feb 5, 2024
1 parent 8c0b4f6 commit ff3fd6a
Showing 1 changed file with 34 additions and 5 deletions.
39 changes: 34 additions & 5 deletions library/std/src/sys/pal/unix/thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -847,11 +847,40 @@ pub mod guard {
let stackptr = get_stack_start_aligned()?;
let guardaddr = stackptr.addr();
// Technically the number of guard pages is tunable and controlled
// by the security.bsd.stack_guard_page sysctl, but there are
// few reasons to change it from the default. The default value has
// been 1 ever since FreeBSD 11.1 and 10.4.
const GUARD_PAGES: usize = 1;
let guard = guardaddr..guardaddr + GUARD_PAGES * page_size;
// by the security.bsd.stack_guard_page sysctl.
// By default it is 1, checking once is enough since it is
// a boot time config value.
static LOCK: crate::sync::OnceLock<usize> = crate::sync::OnceLock::new();
let guard = guardaddr
..guardaddr
+ *LOCK.get_or_init(|| {
extern "C" {
pub fn sysctlbyname(
oid: *const libc::c_char,
ov: *mut libc::c_void,
osize: *mut libc::size_t,
nv: *const libc::c_void,
nsize: libc::size_t,
) -> libc::c_int;
}
let mut guard: usize = 0;
let mut size = crate::mem::size_of_val(&guard);
let oid = crate::ffi::CStr::from_bytes_with_nul(
b"security.bsd.stack_guard_page\0",
)
.unwrap();
let res = sysctlbyname(
oid.as_ptr(),
&mut guard as *mut _ as *mut _,
&mut size as *mut _ as *mut _,
crate::ptr::null_mut(),
0,
);
if res == 0 {
return guard;
}
1
}) * page_size;
Some(guard)
} else if cfg!(target_os = "openbsd") {
// OpenBSD stack already includes a guard page, and stack is
Expand Down

0 comments on commit ff3fd6a

Please sign in to comment.