Skip to content

Commit 8c00174

Browse files
authored
Remove untracked signal modification functions (#1423)
2 parents 08bf4af + e2098c3 commit 8c00174

File tree

8 files changed

+48
-61
lines changed

8 files changed

+48
-61
lines changed

src/exec/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,12 @@ pub enum ExitReason {
206206
fn exec_command(
207207
mut command: Command,
208208
original_set: Option<SignalSet>,
209-
original_signal: Option<SignalsState>,
209+
mut original_signal: SignalsState,
210210
mut errpipe_tx: BinPipe<i32>,
211211
) -> ! {
212212
// Restore the signal handlers of modified signals
213-
if let Some(mut original_signal) = original_signal {
214-
if let Err(err) = original_signal.restore() {
215-
dev_warn!("cannot restore signal states: {err}");
216-
}
213+
if let Err(err) = original_signal.restore() {
214+
dev_warn!("cannot restore signal states: {err}");
217215
}
218216

219217
// Restore the signal mask now that the handlers have been setup.

src/exec/no_pty.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,7 @@ pub(super) fn exec_no_pty(
3333
) -> io::Result<ExitReason> {
3434
// FIXME (ogsudo): Initialize the policy plugin's session here.
3535

36-
let mut original_signals = match SignalsState::save() {
37-
Ok(original_signals) => Some(original_signals),
38-
Err(err) => {
39-
dev_warn!("cannot save state original signals: {err}");
40-
None
41-
}
42-
};
36+
let original_signals = SignalsState::save()?;
4337

4438
// Block all the signals until we are done setting up the signal handlers so we don't miss
4539
// SIGCHLD.
@@ -78,7 +72,7 @@ pub(super) fn exec_no_pty(
7872
sudo_pid,
7973
errpipe_rx,
8074
&mut registry,
81-
&mut original_signals,
75+
original_signals,
8276
)?;
8377

8478
// Restore the signal mask now that the handlers have been setup.
@@ -104,6 +98,7 @@ struct ExecClosure {
10498
sudo_pid: ProcessId,
10599
parent_pgrp: ProcessId,
106100
errpipe_rx: BinPipe<i32>,
101+
original_signals: SignalsState,
107102
signal_stream: &'static SignalStream,
108103
signal_handlers: [SignalHandler; ExecClosure::SIGNALS.len()],
109104
}
@@ -119,21 +114,22 @@ impl ExecClosure {
119114
sudo_pid: ProcessId,
120115
errpipe_rx: BinPipe<i32>,
121116
registry: &mut EventRegistry<Self>,
122-
original_signals: &mut Option<SignalsState>,
117+
mut original_signals: SignalsState,
123118
) -> io::Result<Self> {
124119
registry.register_event(&errpipe_rx, PollEvent::Readable, |_| ExecEvent::ErrPipe);
125120

126121
let signal_stream = SignalStream::init()?;
127122

128123
registry.register_event(signal_stream, PollEvent::Readable, |_| ExecEvent::Signal);
129124

130-
let signal_handlers = register_handlers(Self::SIGNALS, original_signals)?;
125+
let signal_handlers = register_handlers(Self::SIGNALS, &mut original_signals)?;
131126

132127
Ok(Self {
133128
command_pid: Some(command_pid),
134129
errpipe_rx,
135130
sudo_pid,
136131
parent_pgrp: getpgrp(),
132+
original_signals,
137133
signal_stream,
138134
signal_handlers,
139135
})
@@ -161,7 +157,7 @@ impl ExecClosure {
161157
}
162158

163159
/// Suspend the main process.
164-
fn suspend_parent(&self, signal: SignalNumber) {
160+
fn suspend_parent(&mut self, signal: SignalNumber) {
165161
let mut opt_tty = UserTerm::open().ok();
166162
let mut opt_pgrp = None;
167163

@@ -199,9 +195,13 @@ impl ExecClosure {
199195
}
200196

201197
let sigtstp_handler = if signal == SIGTSTP {
202-
SignalHandler::register_untracked(signal, SignalHandlerBehavior::Default)
203-
.map_err(|err| dev_warn!("cannot set handler for {}: {err}", signal_fmt(signal)))
204-
.ok()
198+
SignalHandler::register(
199+
signal,
200+
SignalHandlerBehavior::Default,
201+
&mut self.original_signals,
202+
)
203+
.map_err(|err| dev_warn!("cannot set handler for {}: {err}", signal_fmt(signal)))
204+
.ok()
205205
} else {
206206
None
207207
};

src/exec/use_pty/monitor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub(super) fn exec_monitor(
4141
foreground: bool,
4242
backchannel: &mut MonitorBackchannel,
4343
original_set: Option<SignalSet>,
44-
mut original_signals: Option<SignalsState>,
44+
mut original_signals: SignalsState,
4545
) -> io::Result<Infallible> {
4646
// SIGTTIN and SIGTTOU are ignored here but the docs state that it shouldn't
4747
// be possible to receive them in the first place. Investigate
@@ -235,7 +235,7 @@ impl<'a> MonitorClosure<'a> {
235235
errpipe_rx: BinPipe<i32>,
236236
backchannel: &'a mut MonitorBackchannel,
237237
registry: &mut EventRegistry<Self>,
238-
original_signals: &mut Option<SignalsState>,
238+
original_signals: &mut SignalsState,
239239
) -> io::Result<Self> {
240240
// Store the pgid of the monitor.
241241
let monitor_pgrp = getpgrp();

src/exec/use_pty/parent.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,7 @@ pub(in crate::exec) fn exec_pty(
3535
// Allocate a pseudoterminal.
3636
let pty = get_pty(pty_owner)?;
3737

38-
let mut original_signals = match SignalsState::save() {
39-
Ok(original_signals) => Some(original_signals),
40-
Err(err) => {
41-
dev_warn!("cannot save state original signals: {err}");
42-
None
43-
}
44-
};
38+
let mut original_signals = SignalsState::save()?;
4539

4640
// Create backchannels to communicate with the monitor.
4741
let mut backchannels = BackchannelPair::new().map_err(|err| {
@@ -256,7 +250,7 @@ pub(in crate::exec) fn exec_pty(
256250
term_raw,
257251
preserve_oflag,
258252
&mut registry,
259-
&mut original_signals,
253+
original_signals,
260254
)?;
261255

262256
// Restore the signal mask now that the handlers have been setup.
@@ -327,6 +321,7 @@ struct ParentClosure {
327321
backchannel: ParentBackchannel,
328322
message_queue: VecDeque<MonitorMessage>,
329323
backchannel_write_handle: EventHandle,
324+
original_signals: SignalsState,
330325
signal_stream: &'static SignalStream,
331326
signal_handlers: [SignalHandler; ParentClosure::SIGNALS.len()],
332327
}
@@ -349,7 +344,7 @@ impl ParentClosure {
349344
term_raw: bool,
350345
preserve_oflag: bool,
351346
registry: &mut EventRegistry<Self>,
352-
original_signals: &mut Option<SignalsState>,
347+
mut original_signals: SignalsState,
353348
) -> io::Result<Self> {
354349
// Enable nonblocking assertions as we will poll this inside the event loop.
355350
backchannel.set_nonblocking_asserts(true);
@@ -365,7 +360,7 @@ impl ParentClosure {
365360

366361
registry.register_event(signal_stream, PollEvent::Readable, |_| ParentEvent::Signal);
367362

368-
let signal_handlers = register_handlers(Self::SIGNALS, original_signals)?;
363+
let signal_handlers = register_handlers(Self::SIGNALS, &mut original_signals)?;
369364

370365
Ok(Self {
371366
monitor_pid: Some(monitor_pid),
@@ -380,6 +375,7 @@ impl ParentClosure {
380375
backchannel,
381376
message_queue: VecDeque::new(),
382377
backchannel_write_handle,
378+
original_signals,
383379
signal_stream,
384380
signal_handlers,
385381
})
@@ -540,10 +536,13 @@ impl ParentClosure {
540536
registry: &mut EventRegistry<Self>,
541537
) -> Option<SignalNumber> {
542538
// Ignore `SIGCONT` while suspending to avoid resuming the terminal twice.
543-
let sigcont_handler =
544-
SignalHandler::register_untracked(SIGCONT, SignalHandlerBehavior::Ignore)
545-
.map_err(|err| dev_warn!("cannot set handler for SIGCONT: {err}"))
546-
.ok();
539+
let sigcont_handler = SignalHandler::register(
540+
SIGCONT,
541+
SignalHandlerBehavior::Ignore,
542+
&mut self.original_signals,
543+
)
544+
.map_err(|err| dev_warn!("cannot set handler for SIGCONT: {err}"))
545+
.ok();
547546

548547
if let SIGTTOU | SIGTTIN = signal {
549548
// If sudo is already the foreground process we can resume the command in the
@@ -584,9 +583,13 @@ impl ParentClosure {
584583
}
585584

586585
let signal_handler = if signal != SIGSTOP {
587-
SignalHandler::register_untracked(signal, SignalHandlerBehavior::Default)
588-
.map_err(|err| dev_warn!("cannot set handler for {}: {err}", signal_fmt(signal)))
589-
.ok()
586+
SignalHandler::register(
587+
signal,
588+
SignalHandlerBehavior::Default,
589+
&mut self.original_signals,
590+
)
591+
.map_err(|err| dev_warn!("cannot set handler for {}: {err}", signal_fmt(signal)))
592+
.ok()
590593
} else {
591594
None
592595
};

src/system/signal/handler.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,6 @@ pub(crate) struct SignalHandler {
1616
impl SignalHandler {
1717
const FORBIDDEN: &'static [SignalNumber] = &[SIGKILL, SIGSTOP];
1818

19-
#[inline]
20-
pub(crate) fn register_untracked(
21-
signal: SignalNumber,
22-
behavior: SignalHandlerBehavior,
23-
) -> io::Result<Self> {
24-
Self::register(signal, behavior, &mut None)
25-
}
26-
2719
/// Register a new handler for the given signal with the provided behavior.
2820
///
2921
/// # Panics
@@ -35,7 +27,7 @@ impl SignalHandler {
3527
pub(crate) fn register(
3628
signal: SignalNumber,
3729
behavior: SignalHandlerBehavior,
38-
state: &mut Option<SignalsState>,
30+
state: &mut SignalsState,
3931
) -> io::Result<Self> {
4032
if Self::FORBIDDEN.contains(&signal) {
4133
panic!(
@@ -46,9 +38,7 @@ impl SignalHandler {
4638

4739
let action = SignalAction::new(behavior)?;
4840
let original_action = action.register(signal)?;
49-
if let Some(state) = state {
50-
state.updated(signal)?;
51-
}
41+
state.updated(signal)?;
5242

5343
Ok(Self {
5444
signal,

src/system/signal/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mod stream;
88
pub(crate) use handler::{SignalHandler, SignalHandlerBehavior};
99
pub(crate) use set::SignalSet;
1010
pub(crate) use state::SignalsState;
11-
pub(crate) use stream::{register_handlers, register_handlers_untracked, SignalStream};
11+
pub(crate) use stream::{register_handlers, SignalStream};
1212

1313
use std::borrow::Cow;
1414
use std::ffi::c_int;

src/system/signal/stream.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,10 @@ impl SignalStream {
8585
}
8686
}
8787

88-
#[inline]
89-
pub(crate) fn register_handlers_untracked<const N: usize>(
90-
signals: [SignalNumber; N],
91-
) -> io::Result<[SignalHandler; N]> {
92-
register_handlers(signals, &mut None)
93-
}
94-
9588
#[track_caller]
9689
pub(crate) fn register_handlers<const N: usize>(
9790
signals: [SignalNumber; N],
98-
original_signals: &mut Option<SignalsState>,
91+
original_signals: &mut SignalsState,
9992
) -> io::Result<[SignalHandler; N]> {
10093
let mut handlers = signals.map(|signal| (signal, MaybeUninit::uninit()));
10194

src/visudo/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::{
2020
system::{
2121
file::{create_temporary_dir, Chown, FileLock},
2222
interface::{GroupId, UserId},
23-
signal::{consts::*, register_handlers_untracked, SignalStream},
23+
signal::{consts::*, register_handlers, SignalStream, SignalsState},
2424
Hostname, User,
2525
},
2626
};
@@ -197,7 +197,10 @@ fn run(file_arg: Option<&str>, perms: bool, owner: bool) -> io::Result<()> {
197197

198198
let signal_stream = SignalStream::init()?;
199199

200-
let handlers = register_handlers_untracked([SIGTERM, SIGHUP, SIGINT, SIGQUIT])?;
200+
let handlers = register_handlers(
201+
[SIGTERM, SIGHUP, SIGINT, SIGQUIT],
202+
&mut SignalsState::save()?,
203+
)?;
201204

202205
let tmp_dir = create_temporary_dir()?;
203206
let tmp_path = tmp_dir.join("sudoers");

0 commit comments

Comments
 (0)