From 1b78102a6b7c6bdbfdd36c8c97c1d84788a8de21 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Fri, 17 May 2024 20:21:14 +0200 Subject: [PATCH] cksum: fails in case of unknown algo --- src/uu/cksum/src/cksum.rs | 33 ++++++++++++++++++++------------- tests/by-util/test_cksum.rs | 11 +++++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 6e244d375..54b6d13c9 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -43,6 +43,20 @@ const ALGORITHM_OPTIONS_SHA512: &str = "sha512"; const ALGORITHM_OPTIONS_BLAKE2B: &str = "blake2b"; const ALGORITHM_OPTIONS_SM3: &str = "sm3"; +const SUPPORTED_ALGO: [&str; 11] = [ + ALGORITHM_OPTIONS_SYSV, + ALGORITHM_OPTIONS_BSD, + ALGORITHM_OPTIONS_CRC, + ALGORITHM_OPTIONS_MD5, + ALGORITHM_OPTIONS_SHA1, + ALGORITHM_OPTIONS_SHA224, + ALGORITHM_OPTIONS_SHA256, + ALGORITHM_OPTIONS_SHA384, + ALGORITHM_OPTIONS_SHA512, + ALGORITHM_OPTIONS_BLAKE2B, + ALGORITHM_OPTIONS_SM3, +]; + #[derive(Debug)] enum CkSumError { RawMultipleFiles, @@ -479,6 +493,11 @@ where let (algo_name, length) = if algo_based_format { // When the algo-based format is matched, extract details from regex captures let algorithm = caps.name("algo").map_or("", |m| m.as_str()).to_lowercase(); + if !SUPPORTED_ALGO.contains(&algorithm.as_str()) { + // Not supported algo, leave early + properly_formatted = false; + continue; + } let bits = caps .name("bits") .map(|m| m.as_str().parse::().unwrap() / 8); @@ -688,19 +707,7 @@ pub fn uu_app() -> Command { .short('a') .help("select the digest type to use. See DIGEST below") .value_name("ALGORITHM") - .value_parser([ - ALGORITHM_OPTIONS_SYSV, - ALGORITHM_OPTIONS_BSD, - ALGORITHM_OPTIONS_CRC, - ALGORITHM_OPTIONS_MD5, - ALGORITHM_OPTIONS_SHA1, - ALGORITHM_OPTIONS_SHA224, - ALGORITHM_OPTIONS_SHA256, - ALGORITHM_OPTIONS_SHA384, - ALGORITHM_OPTIONS_SHA512, - ALGORITHM_OPTIONS_BLAKE2B, - ALGORITHM_OPTIONS_SM3, - ]), + .value_parser(SUPPORTED_ALGO), ) .arg( Arg::new(options::UNTAGGED) diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 9072aff86..3002753d8 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -1136,3 +1136,14 @@ fn test_blake2d_tested_with_sha1() { .fails() .stderr_contains("f: no properly formatted checksum lines found"); } + +#[test] +fn test_unknown_sha() { + let (at, mut ucmd) = at_and_ucmd!(); + at.write("f", "SHA4 (README.md) = 00000000\n"); + + ucmd.arg("-c") + .arg("f") + .fails() + .stderr_contains("f: no properly formatted checksum lines found"); +}