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"); +}