From 5a66758097f907282da3845312ca2c246c93dc83 Mon Sep 17 00:00:00 2001 From: xtqqczze <45661989+xtqqczze@users.noreply.github.com> Date: Sun, 9 Aug 2026 00:16:25 +0100 Subject: [PATCH 1/3] uucore: add test_strip_errno_removes_trailing_os_error --- src/uucore/src/lib/mods/error.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index 6149f527667..cd23de65d60 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -797,6 +797,15 @@ impl Display for ClapErrorWrapper { #[cfg(test)] mod tests { + #[test] + fn test_strip_errno_removes_trailing_os_error() { + use super::strip_errno; + use std::io::Error; + + let err = Error::from_raw_os_error(2); + assert_eq!(strip_errno(&err), "No such file or directory"); + } + #[test] #[cfg(unix)] fn test_nix_error_conversion() { From 63856c71c7f3fa6a2a50f8802dd7593084e7192e Mon Sep 17 00:00:00 2001 From: xtqqczze <45661989+xtqqczze@users.noreply.github.com> Date: Sat, 8 Aug 2026 21:56:54 +0100 Subject: [PATCH 2/3] fix: only strip trailing os error suffix --- src/uucore/src/lib/mods/error.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index cd23de65d60..90c1ad95c2f 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -479,9 +479,15 @@ impl Display for UIoError { /// ``` pub fn strip_errno(err: &std::io::Error) -> String { let mut msg = err.to_string(); - if let Some(pos) = msg.find(" (os error ") { - msg.truncate(pos); + + if let Some((prefix, suffix)) = msg.rsplit_once(" (os error ") + && suffix + .strip_suffix(')') + .is_some_and(|n| n.parse::().is_ok()) + { + msg.truncate(prefix.len()); } + msg } From 1588542fb9fb3819b76d87a9250a76d29ead9401 Mon Sep 17 00:00:00 2001 From: xtqqczze <45661989+xtqqczze@users.noreply.github.com> Date: Sun, 9 Aug 2026 00:16:51 +0100 Subject: [PATCH 3/3] uucore: add strip_errno_preserves_nontrailing_os_error --- src/uucore/src/lib/mods/error.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index 90c1ad95c2f..5897f658532 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -812,6 +812,19 @@ mod tests { assert_eq!(strip_errno(&err), "No such file or directory"); } + #[test] + fn strip_errno_preserves_nontrailing_os_error() { + use super::strip_errno; + use std::io::Error; + + let err = Error::other(r#"Permission denied (os error 13) at path "/tmp.haKXBI6xNU""#); + + assert_eq!( + strip_errno(&err), + r#"Permission denied (os error 13) at path "/tmp.haKXBI6xNU""# + ); + } + #[test] #[cfg(unix)] fn test_nix_error_conversion() {