This commit is contained in:
Dave Huseby
2016-01-26 17:37:18 -08:00
parent 50df6b9dc5
commit 0153e64d97
3 changed files with 37 additions and 18 deletions

View File

@@ -135,17 +135,42 @@ mod imp {
Handler { _data: MAIN_ALTSTACK };
}
pub unsafe fn make_handler() -> Handler {
let alt_stack = mmap(ptr::null_mut(),
SIGSTKSZ,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON,
-1,
0);
if alt_stack == MAP_FAILED {
#[cfg(any(target_os = "linux",
target_os = "macos",
target_os = "bitrig",
target_os = "netbsd",
target_os = "openbsd"))]
unsafe fn get_stack() -> *mut libc::c_void {
let stack = mmap(ptr::null_mut(),
SIGSTKSZ,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON,
-1,
0);
if stack == MAP_FAILED {
panic!("failed to allocate an alternative stack");
}
stack
}
#[cfg(any(target_os = "dragonfly",
target_os = "freebsd"))]
unsafe fn get_stack() -> *mut i8 {
let stack = mmap(ptr::null_mut(),
SIGSTKSZ,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON,
-1,
0);
if stack == MAP_FAILED {
panic!("failed to allocate an alternative stack");
}
stack as *mut i8
}
pub unsafe fn make_handler() -> Handler {
let alt_stack = get_stack();
let mut stack: libc::stack_t = mem::zeroed();
stack.ss_sp = alt_stack;
@@ -154,7 +179,7 @@ mod imp {
sigaltstack(&stack, ptr::null_mut());
Handler { _data: alt_stack }
Handler { _data: alt_stack as *mut libc::c_void }
}
pub unsafe fn drop_handler(handler: &mut Handler) {