From 4fe82a56ef93b8e0caf328f33fd15db6eea6bf0c Mon Sep 17 00:00:00 2001 From: Christopher Dryden Date: Fri, 26 Dec 2025 01:49:44 +0000 Subject: [PATCH] dd: handle stderr write errors gracefully in progress output --- src/uu/dd/src/progress.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/uu/dd/src/progress.rs b/src/uu/dd/src/progress.rs index 2ad61cf1b30..416c95f27d5 100644 --- a/src/uu/dd/src/progress.rs +++ b/src/uu/dd/src/progress.rs @@ -18,7 +18,7 @@ use std::time::Duration; #[cfg(target_os = "linux")] use signal_hook::iterator::Handle; use uucore::{ - error::UResult, + error::{UResult, set_exit_code}, format::num_format::{FloatVariant, Formatter}, locale::setup_localization, translate, @@ -231,7 +231,9 @@ impl ProgUpdate { /// See [`ProgUpdate::write_io_lines`] for more information. pub(crate) fn print_io_lines(&self) { let mut stderr = std::io::stderr(); - self.write_io_lines(&mut stderr).unwrap(); + if self.write_io_lines(&mut stderr).is_err() { + set_exit_code(1); + } } /// Re-print the number of bytes written, duration, and throughput. @@ -240,7 +242,9 @@ impl ProgUpdate { pub(crate) fn reprint_prog_line(&self) { let mut stderr = std::io::stderr(); let rewrite = true; - self.write_prog_line(&mut stderr, rewrite).unwrap(); + if self.write_prog_line(&mut stderr, rewrite).is_err() { + set_exit_code(1); + } } /// Write all summary statistics. @@ -248,7 +252,9 @@ impl ProgUpdate { /// See [`ProgUpdate::write_transfer_stats`] for more information. pub(crate) fn print_transfer_stats(&self, new_line: bool) { let mut stderr = std::io::stderr(); - self.write_transfer_stats(&mut stderr, new_line).unwrap(); + if self.write_transfer_stats(&mut stderr, new_line).is_err() { + set_exit_code(1); + } } /// Write all the final statistics.