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.
This commit is contained in:
iximeow 2020-03-12 21:17:10 -07:00
parent 041d97f4fd
commit 0ca2ed3646

View File

@ -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());
}
}
}