From 86061ddbbdb4194362ede72f9900297d8d31d051 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Tue, 2 Dec 2025 17:15:06 +0000 Subject: [PATCH] timeout: prioritize "timed out" exit status * src/timeout.c (cleanup): Reset the default exit status to EXIT_TIMEDOUT, if we have in fact received an ALARM. Otherwise we would exit with status EXIT_CANCELED if there was an issue writing --verbose output for example. This also ensures a consistent exit status with ASAN enabled, as with ASAN stderr is not explicitly closed by gnulib's close_stdout handler. --- src/timeout.c | 6 ++++++ tests/timeout/timeout.sh | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/timeout.c b/src/timeout.c index 7634323d4b..3303b57786 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -206,6 +206,12 @@ cleanup (int sig) if (sig == SIGALRM) { timed_out = 1; + /* In case there is an issue with close_stdout, + update to a more accurate default exit status. + For example we might get failed writes with -v with: + timeout -v 1 sleep 10 2>&1 | : + */ + initialize_exit_failure (EXIT_TIMEDOUT); sig = term_signal; } if (0 < monitored_pid) diff --git a/tests/timeout/timeout.sh b/tests/timeout/timeout.sh index 36dcba2d0a..c7d8a2906f 100755 --- a/tests/timeout/timeout.sh +++ b/tests/timeout/timeout.sh @@ -75,7 +75,7 @@ done # Specifically here we're testing that SIGPIPE is handled. # I.e., that we're not killed by the SIGPIPE (and leave the sleep running). # timeout would exit with 141 usually if SIGPIPE wasn't being handled. -echo 125 > timeout.exp || framework_failure_ +echo 124 > timeout.exp || framework_failure_ { timeout -v .1 sleep 10 2>&1; echo $? >timeout.status; } | : compare timeout.exp timeout.status || fail=1 # Ensure we don't catch/propagate ignored signals -- 2.47.3