Skip to content

Commit

Permalink
std::threads: revisit stack address calculation on netbsd.
Browse files Browse the repository at this point in the history
like older linux glibc versions, we need to get the guard size
 and increasing the stack's bottom address accordingly.
  • Loading branch information
devnexen committed Mar 4, 2024
1 parent 7606c13 commit 7ff3bad
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions library/std/src/sys/pal/unix/thread.rs
Original file line number Diff line number Diff line change
Expand Up @@ -803,12 +803,30 @@ pub mod guard {
Some(stack_ptr.with_addr(stackaddr))
}

#[cfg(target_os = "netbsd")]
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
let mut ret = None;
let mut attr: libc::pthread_attr_t = crate::mem::zeroed();
let e = libc::pthread_getattr_np(libc::pthread_self(), &mut attr);
if e == 0 {
let mut stackaddr = crate::ptr::null_mut();
let mut stacksize = 0;
let mut guardsize = 0;
assert_eq!(libc::pthread_attr_getstack(&attr, &mut stackaddr, &mut stacksize), 0);
// on netbsd, we need to take in account the guard size to push up
// the stack's address from the bottom.
assert_eq!(libc::pthread_attr_getguardsize(&attr, &mut guardsize), 0);
stackaddr = stackaddr.add(guardsize);
ret = Some(stackaddr);
}
ret
}

#[cfg(any(
target_os = "android",
target_os = "freebsd",
target_os = "hurd",
target_os = "linux",
target_os = "netbsd",
target_os = "l4re"
))]
unsafe fn get_stack_start() -> Option<*mut libc::c_void> {
Expand Down Expand Up @@ -911,9 +929,10 @@ pub mod guard {
}
}) * page_size;
Some(guard)
} else if cfg!(target_os = "openbsd") {
} else if cfg!(any(target_os = "openbsd", target_os = "netbsd")) {
// OpenBSD stack already includes a guard page, and stack is
// immutable.
// NetBSD stack includes the guard page.
//
// We'll just note where we expect rlimit to start
// faulting, so our handler can report "stack overflow", and
Expand Down

0 comments on commit 7ff3bad

Please sign in to comment.