diff --git a/src/uucore/src/lib/features/signals.rs b/src/uucore/src/lib/features/signals.rs index a5141f299..275f7acd2 100644 --- a/src/uucore/src/lib/features/signals.rs +++ b/src/uucore/src/lib/features/signals.rs @@ -538,6 +538,9 @@ static STDERR_WAS_CLOSED: AtomicBool = AtomicBool::new(false); #[cfg(unix)] static SIGPIPE_WAS_IGNORED: AtomicBool = AtomicBool::new(false); +#[cfg(unix)] +static STARTUP_STATE_WAS_CAPTURED: AtomicBool = AtomicBool::new(false); + /// Captures stdio and SIGPIPE state at process initialization, before main() runs. /// /// # Safety @@ -549,6 +552,11 @@ pub unsafe extern "C" fn capture_startup_state() { use std::mem::MaybeUninit; use std::ptr; + // No spinlock because we're single-threaded at this point + if STARTUP_STATE_WAS_CAPTURED.swap(true, Ordering::Relaxed) { + return; + } + // Capture stdio state unsafe { STDIN_WAS_CLOSED.store(