Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ To generate [gcov-based](https://github.com/mozilla/grcov#example-how-to-generat
export CARGO_INCREMENTAL=0
export RUSTFLAGS="-Cinstrument-coverage -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort"
export RUSTDOCFLAGS="-Cpanic=abort"
export RUSTUP_TOOLCHAIN="nightly"
cargo build <options...> # e.g., --features feat_os_unix
cargo test <options...> # e.g., --features feat_os_unix test_pathchk
grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing --ignore build.rs --excl-br-line "^\s*((debug_)?assert(_eq|_ne)?\#\[derive\()" -o ./target/debug/coverage/
Expand Down
21 changes: 16 additions & 5 deletions src/uu/timeout/src/timeout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,14 @@ fn wait_or_kill_process(
match process.wait_or_timeout(duration, None) {
Ok(Some(status)) => {
if preserve_status {
Ok(status.code().unwrap_or_else(|| status.signal().unwrap()))
let exit_code = status.code().unwrap_or_else(|| {
status.signal().unwrap_or_else(|| {
// Extremely rare: process exited but we have neither exit code nor signal.
// This can happen on some platforms or in unusual termination scenarios.
ExitStatus::TimeoutFailed.into()
})
});
Ok(exit_code)
} else {
Ok(ExitStatus::TimeoutFailed.into())
}
Expand Down Expand Up @@ -351,10 +358,14 @@ fn timeout(
// structure of `wait_or_kill_process()`. They can probably be
// refactored into some common function.
match process.wait_or_timeout(duration, Some(&SIGNALED)) {
Ok(Some(status)) => Err(status
.code()
.unwrap_or_else(|| preserve_signal_info(status.signal().unwrap()))
.into()),
Ok(Some(status)) => {
let exit_code = status.code().unwrap_or_else(|| {
status
.signal()
.map_or_else(|| ExitStatus::TimeoutFailed.into(), preserve_signal_info)
});
Err(exit_code.into())
}
Ok(None) => {
report_if_verbose(signal, &cmd[0], verbose);
send_signal(process, signal, foreground);
Expand Down
Loading