diff --git a/src/exec/use_pty/monitor.rs b/src/exec/use_pty/monitor.rs index 1b763eb65..0d56d1045 100644 --- a/src/exec/use_pty/monitor.rs +++ b/src/exec/use_pty/monitor.rs @@ -298,9 +298,7 @@ impl<'a> MonitorClosure<'a> { Err(err) => registry.set_break(err), Ok(error_code) => { // Received error code from the command, forward it to the parent. - self.backchannel - .send(&ParentMessage::IoError(error_code)) - .ok(); + registry.set_break(io::Error::from_raw_os_error(error_code)); } } } diff --git a/test-framework/sudo-compliance-tests/src/sudo/misc.rs b/test-framework/sudo-compliance-tests/src/sudo/misc.rs index 3ed28923b..b7d7b1153 100644 --- a/test-framework/sudo-compliance-tests/src/sudo/misc.rs +++ b/test-framework/sudo-compliance-tests/src/sudo/misc.rs @@ -1,5 +1,4 @@ -use sudo_test::User; -use sudo_test::{helpers::assert_ls_output, Command, Env, BIN_SUDO}; +use sudo_test::{helpers::assert_ls_output, is_original_sudo, Command, Env, User, BIN_SUDO}; use crate::{Result, PANIC_EXIT_CODE, SUDOERS_ALL_ALL_NOPASSWD, USERNAME}; @@ -202,6 +201,25 @@ fn does_not_panic_on_io_errors_cli_error() -> Result<()> { Ok(()) } +#[test] +fn does_not_panic_on_invalid_executable() { + let env = Env(SUDOERS_ALL_ALL_NOPASSWD).build(); + + let output = Command::new("bash") + .args(["-c", "sudo /tmp; a=$?; sleep .1; exit $a"]) + .tty(true) // Necessary to reproduce the panic + .output(&env); + output.assert_exit_code(1); + + assert!(!output.stderr().contains("panic"), "{output:?}"); + assert!(!output.stdout_unchecked().contains("panic"), "{output:?}"); + if is_original_sudo() { + assert_contains!(output.stdout_unchecked(), "command not found"); + } else { + assert_contains!(output.stdout_unchecked(), "Permission denied"); + } +} + #[test] #[cfg_attr( target_os = "freebsd",