diff options
| author | bors <bors@rust-lang.org> | 2024-02-15 17:00:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-02-15 17:00:55 +0000 |
| commit | cbddf31863495050e840571d2730c95b29dcc27f (patch) | |
| tree | 6316e411f126cfeefe1ef0e6de18b5147eeab96d /library/std/src | |
| parent | 62fb0db9a5a2a381f81ce0474c9bbd9ad385dd88 (diff) | |
| parent | 06f53dd3166f068435ee2f08e108d2d1e0d5db50 (diff) | |
| download | rust-cbddf31863495050e840571d2730c95b29dcc27f.tar.gz rust-cbddf31863495050e840571d2730c95b29dcc27f.zip | |
Auto merge of #121142 - GuillaumeGomez:rollup-5qmksjw, r=GuillaumeGomez
Rollup of 8 pull requests
Successful merges:
- #120449 (Document requirements for unsized {Rc,Arc}::from_raw)
- #120505 (Fix BTreeMap's Cursor::remove_{next,prev})
- #120672 (std::thread update freebsd stack guard handling.)
- #121088 (Implicitly enable evex512 if avx512 is enabled)
- #121104 (Ignore unsized types when trying to determine the size of the original type)
- #121107 (Fix msg for verbose suggestions with confusable capitalization)
- #121113 (Continue compilation even if inherent impl checks fail)
- #121120 (Add `ErrorGuaranteed` to `ast::LitKind::Err`, `token::LitKind::Err`.)
r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sys/pal/unix/thread.rs | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/library/std/src/sys/pal/unix/thread.rs b/library/std/src/sys/pal/unix/thread.rs index 7e4a01a5ecd..ba8d31c23a5 100644 --- a/library/std/src/sys/pal/unix/thread.rs +++ b/library/std/src/sys/pal/unix/thread.rs @@ -847,11 +847,31 @@ 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(|| { + use crate::sys::weak::dlsym; + dlsym!(fn sysctlbyname(*const libc::c_char, *mut libc::c_void, *mut libc::size_t, *const libc::c_void, 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(); + match sysctlbyname.get() { + Some(fcn) => { + if fcn(oid.as_ptr(), &mut guard as *mut _ as *mut _, &mut size as *mut _ as *mut _, crate::ptr::null_mut(), 0) == 0 { + return guard; + } + return 1; + }, + _ => { return 1; } + } + }) * page_size; Some(guard) } else if cfg!(target_os = "openbsd") { // OpenBSD stack already includes a guard page, and stack is |
