From b89a6255a9cb5ee09867707f395d02929273dc45 Mon Sep 17 00:00:00 2001 From: Julian <61988360+just-an-engineer@users.noreply.github.com> Date: Sat, 7 Sep 2024 09:34:03 -0400 Subject: [PATCH] dd: fix issue #5905 (different error msg from GNU) (#6622) * Changed dd parsing error message to be in line with GNU dd * Correct logic to make dd incorrect number error message fully compatible with GNU. Add test --------- Co-authored-by: just-an-engineer --- src/uu/dd/src/parseargs.rs | 13 +++++++------ tests/by-util/test_dd.rs | 13 +++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/uu/dd/src/parseargs.rs b/src/uu/dd/src/parseargs.rs index 93d6c63a9..59836b1a1 100644 --- a/src/uu/dd/src/parseargs.rs +++ b/src/uu/dd/src/parseargs.rs @@ -430,7 +430,7 @@ impl std::fmt::Display for ParseError { write!(f, "Unrecognized conv=CONV -> {arg}") } Self::MultiplierStringParseFailure(arg) => { - write!(f, "Unrecognized byte multiplier -> {arg}") + write!(f, "invalid number: ‘{arg}’") } Self::MultiplierStringOverflow(arg) => { write!( @@ -474,8 +474,9 @@ fn show_zero_multiplier_warning() { } /// Parse bytes using str::parse, then map error if needed. -fn parse_bytes_only(s: &str) -> Result { - s.parse() +fn parse_bytes_only(s: &str, i: usize) -> Result { + s[..i] + .parse() .map_err(|_| ParseError::MultiplierStringParseFailure(s.to_string())) } @@ -520,9 +521,9 @@ fn parse_bytes_no_x(full: &str, s: &str) -> Result { return Err(ParseError::InvalidNumber(full.to_string())) } }, - (Some(i), None, None) => (parse_bytes_only(&s[..i])?, 1), - (None, Some(i), None) => (parse_bytes_only(&s[..i])?, 2), - (None, None, Some(i)) => (parse_bytes_only(&s[..i])?, 512), + (Some(i), None, None) => (parse_bytes_only(s, i)?, 1), + (None, Some(i), None) => (parse_bytes_only(s, i)?, 2), + (None, None, Some(i)) => (parse_bytes_only(s, i)?, 512), _ => return Err(ParseError::MultiplierStringParseFailure(full.to_string())), }; num.checked_mul(multiplier) diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index a8cb0aa64..bce1e31ec 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -1775,3 +1775,16 @@ fn test_stdin_stdout_not_rewound_even_when_connected_to_seekable_file() { println!("stdout:\n{}", out_file_content); assert_eq!(out_file_content, "bde"); } + +#[test] +fn test_wrong_number_err_msg() { + new_ucmd!() + .args(&["count=kBb"]) + .fails() + .stderr_contains("dd: invalid number: ‘kBb’\n"); + + new_ucmd!() + .args(&["count=1kBb555"]) + .fails() + .stderr_contains("dd: invalid number: ‘1kBb555’\n"); +}