diff options
| author | iximeow <me@iximeow.net> | 2020-03-12 21:17:10 -0700 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2020-03-12 21:17:10 -0700 |
| commit | 0ca2ed364662351da9e8a1f4ba54e027e1f420df (patch) | |
| tree | 4016e599df56a467a529fd98b1345900bcd879a4 /src/libstd/sys/unix/stack_overflow.rs | |
| parent | 041d97f4fdd625ca193e29f389f754904441aa04 (diff) | |
| download | rust-0ca2ed364662351da9e8a1f4ba54e027e1f420df.tar.gz rust-0ca2ed364662351da9e8a1f4ba54e027e1f420df.zip | |
return a pointer to the end of the valid part of the sigstack, no further
also unmap the whole thing when cleaning up, rather than leaving a spare page floating around.
Diffstat (limited to 'src/libstd/sys/unix/stack_overflow.rs')
| -rw-r--r-- | src/libstd/sys/unix/stack_overflow.rs | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/libstd/sys/unix/stack_overflow.rs b/src/libstd/sys/unix/stack_overflow.rs index db42e11683a..c4d771d75d9 100644 --- a/src/libstd/sys/unix/stack_overflow.rs +++ b/src/libstd/sys/unix/stack_overflow.rs @@ -47,6 +47,7 @@ mod imp { use libc::{sigaltstack, SIGSTKSZ, SS_DISABLE}; use libc::{MAP_ANON, MAP_PRIVATE, PROT_NONE, PROT_READ, PROT_WRITE, SIGSEGV}; + use crate::sys::unix::os::page_size; use crate::sys_common::thread_info; #[cfg(any(target_os = "linux", target_os = "android"))] @@ -137,17 +138,16 @@ mod imp { } unsafe fn get_stackp() -> *mut libc::c_void { - let page_size = crate::sys::unix::os::page_size(); let stackp = - mmap(ptr::null_mut(), SIGSTKSZ + page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + mmap(ptr::null_mut(), SIGSTKSZ + page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if stackp == MAP_FAILED { panic!("failed to allocate an alternative stack"); } - let guard_result = libc::mprotect(stackp, page_size, PROT_NONE); + let guard_result = libc::mprotect(stackp, page_size(), PROT_NONE); if guard_result != 0 { panic!("failed to set up alternative stack guard page"); } - stackp + stackp.add(page_size()) } #[cfg(any( @@ -195,7 +195,9 @@ mod imp { ss_size: SIGSTKSZ, }; sigaltstack(&stack, ptr::null_mut()); - munmap(handler._data, SIGSTKSZ); + // We know from `get_stackp` that the alternate stack we installed is part of a mapping + // that started one page earlier, so walk back a page and unmap from there. + munmap(handler._data.sub(page_size()), SIGSTKSZ + page_size()); } } } |
