Ignore SigPipe by default (#1741)

* Ignore SigPipe by default

* Fix no_std

* fmt
This commit is contained in:
Dominik Maier 2023-12-22 16:50:36 +01:00 committed by GitHub
parent c93291ab57
commit 16a152267e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 34 deletions

View File

@ -56,6 +56,8 @@ fork = ["libafl_bolts/derive"]
## Collected stats to decide if observers must be serialized or not (which should reduce mem use and increase speed) ## Collected stats to decide if observers must be serialized or not (which should reduce mem use and increase speed)
adaptive_serialization = [] adaptive_serialization = []
## If this feature is set, `LibAFL` targets (and the fuzzer) will crash on `SIGPIPE` on unix systems.
handle_sigpipe = []
#! ## Additional Components #! ## Additional Components

View File

@ -5,7 +5,7 @@
#![allow(clippy::needless_pass_by_value)] #![allow(clippy::needless_pass_by_value)]
use alloc::boxed::Box; use alloc::boxed::Box;
#[cfg(all(unix, feature = "std"))] #[cfg(unix)]
use alloc::vec::Vec; use alloc::vec::Vec;
#[cfg(all(feature = "std", unix, target_os = "linux"))] #[cfg(all(feature = "std", unix, target_os = "linux"))]
use core::ptr::addr_of_mut; use core::ptr::addr_of_mut;
@ -28,8 +28,10 @@ use std::intrinsics::transmute;
#[cfg(all(unix, not(miri)))] #[cfg(all(unix, not(miri)))]
use libafl_bolts::os::unix_signals::setup_signal_handler; use libafl_bolts::os::unix_signals::setup_signal_handler;
#[cfg(unix)]
use libafl_bolts::os::unix_signals::Signal;
#[cfg(all(feature = "std", unix))] #[cfg(all(feature = "std", unix))]
use libafl_bolts::os::unix_signals::{ucontext_t, Handler, Signal}; use libafl_bolts::os::unix_signals::{ucontext_t, Handler};
#[cfg(all(windows, feature = "std"))] #[cfg(all(windows, feature = "std"))]
use libafl_bolts::os::windows_exceptions::setup_exception_handler; use libafl_bolts::os::windows_exceptions::setup_exception_handler;
#[cfg(all(feature = "std", unix))] #[cfg(all(feature = "std", unix))]
@ -276,6 +278,24 @@ pub struct InProcessHandlers {
pub timeout_handler: *const c_void, pub timeout_handler: *const c_void,
} }
/// The common signals we want to handle
#[cfg(unix)]
#[inline]
fn common_signals() -> Vec<Signal> {
vec![
Signal::SigAlarm,
Signal::SigUser2,
Signal::SigAbort,
Signal::SigBus,
#[cfg(feature = "handle_sigpipe")]
Signal::SigPipe,
Signal::SigFloatingPointException,
Signal::SigIllegalInstruction,
Signal::SigSegmentationFault,
Signal::SigTrap,
]
}
impl InProcessHandlers { impl InProcessHandlers {
/// Call before running a target. /// Call before running a target.
#[allow(clippy::unused_self)] #[allow(clippy::unused_self)]
@ -683,6 +703,7 @@ pub mod unix_signal_handler {
use libafl_bolts::os::unix_signals::{ucontext_t, Handler, Signal}; use libafl_bolts::os::unix_signals::{ucontext_t, Handler, Signal};
use libc::siginfo_t; use libc::siginfo_t;
use super::common_signals;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use crate::inputs::Input; use crate::inputs::Input;
use crate::{ use crate::{
@ -743,17 +764,7 @@ pub mod unix_signal_handler {
} }
fn signals(&self) -> Vec<Signal> { fn signals(&self) -> Vec<Signal> {
vec![ common_signals()
Signal::SigAlarm,
Signal::SigUser2,
Signal::SigAbort,
Signal::SigBus,
Signal::SigPipe,
Signal::SigFloatingPointException,
Signal::SigIllegalInstruction,
Signal::SigSegmentationFault,
Signal::SigTrap,
]
} }
} }
@ -1541,17 +1552,7 @@ impl Handler for InProcessForkExecutorGlobalData {
} }
fn signals(&self) -> Vec<Signal> { fn signals(&self) -> Vec<Signal> {
vec![ common_signals()
Signal::SigAlarm,
Signal::SigUser2,
Signal::SigAbort,
Signal::SigBus,
Signal::SigPipe,
Signal::SigFloatingPointException,
Signal::SigIllegalInstruction,
Signal::SigSegmentationFault,
Signal::SigTrap,
]
} }
} }

View File

@ -331,16 +331,6 @@ impl From<Signal> for nix::sys::signal::Signal {
} }
} }
/// A list of crashing signals
pub static CRASH_SIGNALS: &[Signal] = &[
Signal::SigAbort,
Signal::SigBus,
Signal::SigFloatingPointException,
Signal::SigIllegalInstruction,
Signal::SigPipe,
Signal::SigSegmentationFault,
];
impl PartialEq for Signal { impl PartialEq for Signal {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
*self as i32 == *other as i32 *self as i32 == *other as i32