diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 4f885e085dd..35291369c12 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -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 # e.g., --features feat_os_unix cargo test # 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/ diff --git a/src/uu/timeout/src/timeout.rs b/src/uu/timeout/src/timeout.rs index 3e1a35c45b2..290b5051f29 100644 --- a/src/uu/timeout/src/timeout.rs +++ b/src/uu/timeout/src/timeout.rs @@ -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()) } @@ -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);