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:
parent
041d97f4fd
commit
0ca2ed3646
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user