using signalstack
This commit is contained in:
parent
fd2de83e1c
commit
ce499f858f
@ -195,13 +195,10 @@ pub mod unix_signals {
|
|||||||
|
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
use fs::read_to_string;
|
|
||||||
|
|
||||||
// Unhandled signals: SIGALRM, SIGHUP, SIGINT, SIGKILL, SIGQUIT, SIGTERM
|
// Unhandled signals: SIGALRM, SIGHUP, SIGINT, SIGKILL, SIGQUIT, SIGTERM
|
||||||
use libc::{
|
use libc::{
|
||||||
c_int, c_void, sigaction, siginfo_t, SA_NODEFER, SA_SIGINFO, SIGABRT, SIGBUS, SIGFPE,
|
c_int, c_void, malloc, sigaction, sigaltstack, siginfo_t, SA_NODEFER, SA_ONSTACK,
|
||||||
SIGILL, SIGPIPE, SIGSEGV, SIGUSR2,
|
SA_SIGINFO, SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGPIPE, SIGSEGV, SIGUSR2,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
@ -219,6 +216,10 @@ pub mod unix_signals {
|
|||||||
state::State,
|
state::State,
|
||||||
utils::Rand,
|
utils::Rand,
|
||||||
};
|
};
|
||||||
|
/// Let's get 8 mb for now.
|
||||||
|
const SIGNAL_STACK_SIZE: usize = 2 << 22;
|
||||||
|
/// To be able to handle SIGSEGV when the stack is exhausted, we need our own little stack space.
|
||||||
|
static mut SIGNAL_STACK_PTR: *const c_void = ptr::null_mut();
|
||||||
|
|
||||||
/// Pointers to values only needed on crash. As the program will not continue after a crash,
|
/// Pointers to values only needed on crash. As the program will not continue after a crash,
|
||||||
/// we should (tm) be okay with raw pointers here,
|
/// we should (tm) be okay with raw pointers here,
|
||||||
@ -332,7 +333,6 @@ pub mod unix_signals {
|
|||||||
I: Input,
|
I: Input,
|
||||||
R: Rand,
|
R: Rand,
|
||||||
{
|
{
|
||||||
println!("Setting oncrash");
|
|
||||||
CURRENT_INPUT_PTR = input as *const _ as *const c_void;
|
CURRENT_INPUT_PTR = input as *const _ as *const c_void;
|
||||||
STATE_PTR = state as *mut _ as *mut c_void;
|
STATE_PTR = state as *mut _ as *mut c_void;
|
||||||
EVENT_MGR_PTR = event_mgr as *mut _ as *mut c_void;
|
EVENT_MGR_PTR = event_mgr as *mut _ as *mut c_void;
|
||||||
@ -340,7 +340,6 @@ pub mod unix_signals {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn reset_oncrash_ptrs<C, EM, FT, I, OT, R>() {
|
pub unsafe fn reset_oncrash_ptrs<C, EM, FT, I, OT, R>() {
|
||||||
println!("Resetting oncrash");
|
|
||||||
CURRENT_INPUT_PTR = ptr::null();
|
CURRENT_INPUT_PTR = ptr::null();
|
||||||
STATE_PTR = ptr::null_mut();
|
STATE_PTR = ptr::null_mut();
|
||||||
EVENT_MGR_PTR = ptr::null_mut();
|
EVENT_MGR_PTR = ptr::null_mut();
|
||||||
@ -356,9 +355,21 @@ pub mod unix_signals {
|
|||||||
I: Input,
|
I: Input,
|
||||||
R: Rand,
|
R: Rand,
|
||||||
{
|
{
|
||||||
|
// First, set up our own stack to be used during segfault handling. (and specify `SA_ONSTACK` in `sigaction`)
|
||||||
|
if SIGNAL_STACK_PTR.is_null() {
|
||||||
|
SIGNAL_STACK_PTR = malloc(SIGNAL_STACK_SIZE);
|
||||||
|
if SIGNAL_STACK_PTR.is_null() {
|
||||||
|
panic!(
|
||||||
|
"Failed to allocate signal stack with {} bytes!",
|
||||||
|
SIGNAL_STACK_SIZE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sigaltstack(SIGNAL_STACK_PTR as _, ptr::null_mut() as _);
|
||||||
|
|
||||||
let mut sa: sigaction = mem::zeroed();
|
let mut sa: sigaction = mem::zeroed();
|
||||||
libc::sigemptyset(&mut sa.sa_mask as *mut libc::sigset_t);
|
libc::sigemptyset(&mut sa.sa_mask as *mut libc::sigset_t);
|
||||||
sa.sa_flags = SA_NODEFER | SA_SIGINFO;
|
sa.sa_flags = SA_NODEFER | SA_SIGINFO | SA_ONSTACK;
|
||||||
sa.sa_sigaction = libaflrs_executor_inmem_handle_crash::<C, EM, FT, I, OT, R> as usize;
|
sa.sa_sigaction = libaflrs_executor_inmem_handle_crash::<C, EM, FT, I, OT, R> as usize;
|
||||||
for (sig, msg) in &[
|
for (sig, msg) in &[
|
||||||
(SIGSEGV, "segfault"),
|
(SIGSEGV, "segfault"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user