From 7abdd916140ae1e8e1b706205f3e785b7d3c9e5d Mon Sep 17 00:00:00 2001 From: Dorian Peron Date: Fri, 5 Dec 2025 19:13:25 +0100 Subject: [PATCH 1/2] hashsum: Fix length processing to fix last GNU test --- src/uu/hashsum/src/hashsum.rs | 11 +++++------ src/uucore/src/lib/features/checksum/mod.rs | 19 ++++++++----------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index d6258210f..d1cc0d882 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -11,7 +11,7 @@ use std::num::ParseIntError; use std::path::Path; use clap::builder::ValueParser; -use clap::{Arg, ArgAction, ArgMatches, Command, value_parser}; +use clap::{Arg, ArgAction, ArgMatches, Command}; use uucore::checksum::compute::{ ChecksumComputeOptions, figure_out_output_format, perform_checksum_computation, @@ -19,7 +19,7 @@ use uucore::checksum::compute::{ use uucore::checksum::validate::{ ChecksumValidateOptions, ChecksumVerbose, perform_checksum_validation, }; -use uucore::checksum::{AlgoKind, ChecksumError, SizedAlgoKind, calculate_blake2b_length}; +use uucore::checksum::{AlgoKind, ChecksumError, SizedAlgoKind, calculate_blake2b_length_str}; use uucore::error::UResult; use uucore::line_ending::LineEnding; use uucore::{format_usage, translate}; @@ -139,14 +139,14 @@ pub fn uumain(mut args: impl uucore::Args) -> UResult<()> { // least somewhat better from a user's perspective. let matches = uucore::clap_localization::handle_clap_result(command, args)?; - let input_length: Option<&usize> = if binary_name == "b2sum" { - matches.get_one::(options::LENGTH) + let input_length: Option<&String> = if binary_name == "b2sum" { + matches.get_one::(options::LENGTH) } else { None }; let length = match input_length { - Some(length) => calculate_blake2b_length(*length)?, + Some(length) => calculate_blake2b_length_str(length)?, None => None, }; @@ -378,7 +378,6 @@ fn uu_app_opt_length(command: Command) -> Command { command.arg( Arg::new(options::LENGTH) .long(options::LENGTH) - .value_parser(value_parser!(usize)) .short('l') .help(translate!("hashsum-help-length")) .overrides_with(options::LENGTH) diff --git a/src/uucore/src/lib/features/checksum/mod.rs b/src/uucore/src/lib/features/checksum/mod.rs index 5339f833f..455a4e1bf 100644 --- a/src/uucore/src/lib/features/checksum/mod.rs +++ b/src/uucore/src/lib/features/checksum/mod.rs @@ -289,7 +289,9 @@ impl SizedAlgoKind { } // [`calculate_blake2b_length`] expects a length in bits but we // have a length in bytes. - (ak::Blake2b, Some(l)) => Ok(Self::Blake2b(calculate_blake2b_length(8 * l)?)), + (ak::Blake2b, Some(l)) => Ok(Self::Blake2b(calculate_blake2b_length_str( + &(8 * l).to_string(), + )?)), (ak::Blake2b, None) => Ok(Self::Blake2b(None)), (ak::Sha224, None) => Ok(Self::Sha2(ShaLength::Len224)), @@ -442,11 +444,6 @@ pub fn digest_reader( Ok((digest.result(), output_size)) } -/// Calculates the length of the digest. -pub fn calculate_blake2b_length(bit_length: usize) -> UResult> { - calculate_blake2b_length_str(bit_length.to_string().as_str()) -} - /// Calculates the length of the digest. pub fn calculate_blake2b_length_str(bit_length: &str) -> UResult> { // Blake2b's length is parsed in an u64. @@ -596,10 +593,10 @@ mod tests { #[test] fn test_calculate_blake2b_length() { - assert_eq!(calculate_blake2b_length(0).unwrap(), None); - assert!(calculate_blake2b_length(10).is_err()); - assert!(calculate_blake2b_length(520).is_err()); - assert_eq!(calculate_blake2b_length(512).unwrap(), None); - assert_eq!(calculate_blake2b_length(256).unwrap(), Some(32)); + assert_eq!(calculate_blake2b_length_str("0").unwrap(), None); + assert!(calculate_blake2b_length_str("10").is_err()); + assert!(calculate_blake2b_length_str("520").is_err()); + assert_eq!(calculate_blake2b_length_str("512").unwrap(), None); + assert_eq!(calculate_blake2b_length_str("256").unwrap(), Some(32)); } } From 00d90700ca31a7a619ae257b690fd21e187a6caa Mon Sep 17 00:00:00 2001 From: Dorian Peron Date: Mon, 8 Dec 2025 13:10:37 +0100 Subject: [PATCH 2/2] test(hashsum): Improve tests for checking length validation errors for BLAKE2b --- tests/by-util/test_hashsum.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index beaf994e1..0ca3c27e4 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -3,6 +3,8 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. +use rstest::rstest; + use uutests::new_ucmd; use uutests::util::TestScenario; use uutests::util_name; @@ -250,11 +252,16 @@ fn test_invalid_b2sum_length_option_not_multiple_of_8() { .ccmd("b2sum") .arg("--length=9") .arg(at.subdir.join("testf")) - .fails_with_code(1); + .fails_with_code(1) + .stderr_contains("b2sum: invalid length: '9'") + .stderr_contains("b2sum: length is not a multiple of 8"); } -#[test] -fn test_invalid_b2sum_length_option_too_large() { +#[rstest] +#[case("513")] +#[case("1024")] +#[case("18446744073709552000")] +fn test_invalid_b2sum_length_option_too_large(#[case] len: &str) { let scene = TestScenario::new(util_name!()); let at = &scene.fixtures; @@ -262,9 +269,13 @@ fn test_invalid_b2sum_length_option_too_large() { scene .ccmd("b2sum") - .arg("--length=513") + .arg("--length") + .arg(len) .arg(at.subdir.join("testf")) - .fails_with_code(1); + .fails_with_code(1) + .no_stdout() + .stderr_contains(format!("b2sum: invalid length: '{len}'")) + .stderr_contains("b2sum: maximum digest length for 'BLAKE2b' is 512 bits"); } #[test]