unix: lift init of sigaltstack before sigaction · model-checking/verify-rust-std@33a32f2 (original) (raw)

`@@ -123,28 +123,36 @@ mod imp {

`

123

123

`static MAIN_ALTSTACK: AtomicPtrlibc::c_void = AtomicPtr::new(ptr::null_mut());

`

124

124

`static NEED_ALTSTACK: AtomicBool = AtomicBool::new(false);

`

125

125

``

``

126

`+

/// # Safety

`

``

127

`+

/// Must be called only once

`

``

128

`+

#[forbid(unsafe_op_in_unsafe_fn)]

`

126

129

`pub unsafe fn init() {

`

127

130

`PAGE_SIZE.store(os::page_size(), Ordering::Relaxed);

`

128

131

``

129

132

`// Always write to GUARD to ensure the TLS variable is allocated.

`

130

``

`-

let guard = install_main_guard().unwrap_or(0..0);

`

``

133

`+

let guard = unsafe { install_main_guard().unwrap_or(0..0) };

`

131

134

`GUARD.set((guard.start, guard.end));

`

132

135

``

133

``

`-

let mut action: sigaction = mem::zeroed();

`

``

136

`+

// SAFETY: assuming all platforms define struct sigaction as "zero-initializable"

`

``

137

`+

let mut action: sigaction = unsafe { mem::zeroed() };

`

134

138

`for &signal in &[SIGSEGV, SIGBUS] {

`

135

``

`-

sigaction(signal, ptr::null_mut(), &mut action);

`

``

139

`+

// SAFETY: just fetches the current signal handler into action

`

``

140

`+

unsafe { sigaction(signal, ptr::null_mut(), &mut action) };

`

136

141

`// Configure our signal handler if one is not already set.

`

137

142

`if action.sa_sigaction == SIG_DFL {

`

``

143

`+

if !NEED_ALTSTACK.load(Ordering::Relaxed) {

`

``

144

`+

// haven't set up our sigaltstack yet

`

``

145

`+

NEED_ALTSTACK.store(true, Ordering::Release);

`

``

146

`+

let handler = unsafe { make_handler(true) };

`

``

147

`+

MAIN_ALTSTACK.store(handler.data, Ordering::Relaxed);

`

``

148

`+

mem::forget(handler);

`

``

149

`+

}

`

138

150

` action.sa_flags = SA_SIGINFO | SA_ONSTACK;

`

139

151

` action.sa_sigaction = signal_handler as sighandler_t;

`

140

``

`-

sigaction(signal, &action, ptr::null_mut());

`

141

``

`-

NEED_ALTSTACK.store(true, Ordering::Relaxed);

`

``

152

`+

// SAFETY: only overriding signals if the default is set

`

``

153

`+

unsafe { sigaction(signal, &action, ptr::null_mut()) };

`

142

154

`}

`

143

155

`}

`

144

``

-

145

``

`-

let handler = make_handler(true);

`

146

``

`-

MAIN_ALTSTACK.store(handler.data, Ordering::Relaxed);

`

147

``

`-

mem::forget(handler);

`

148

156

`}

`

149

157

``

150

158

`pub unsafe fn cleanup() {

`