From eaabd434d8b57964bb5b5a0809c04e167e416ee1 Mon Sep 17 00:00:00 2001 From: Atomei Alexandru Constantin Date: Tue, 9 Jan 2024 21:08:10 +0200 Subject: [PATCH 1/3] Made cksum to return an error if it is used on a directory regardless of the algorithm --- src/uu/cksum/src/cksum.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 77f2749443c..5ae6ab71481 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -140,7 +140,13 @@ where }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) .map_err_context(|| "failed to read input".to_string())?; - + if filename.is_dir() { + return Err(io::Error::new( + io::ErrorKind::InvalidInput, + format!("{}: Is a directory", filename.display()), + ) + .into()); + } // The BSD checksum output is 5 digit integer let bsd_width = 5; match (options.algo_name, not_file) { @@ -169,13 +175,6 @@ where (ALGORITHM_OPTIONS_CRC, true) => println!("{sum} {sz}"), (ALGORITHM_OPTIONS_CRC, false) => println!("{sum} {sz} {}", filename.display()), (ALGORITHM_OPTIONS_BLAKE2B, _) if !options.untagged => { - if filename.is_dir() { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!("{}: Is a directory", filename.display()), - ) - .into()); - } if let Some(length) = options.length { // Multiply by 8 here, as we want to print the length in bits. println!("BLAKE2b-{} ({}) = {sum}", length * 8, filename.display()); From ab71fe23c6f997f61d4c1ff0a55e8bc8140abc82 Mon Sep 17 00:00:00 2001 From: Atomei Alexandru Constantin Date: Thu, 11 Jan 2024 21:42:14 +0200 Subject: [PATCH 2/3] Added one more test for cksum on folders and deleted an old one that expected it to succeed instead of fail --- tests/by-util/test_cksum.rs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index fd55a69e487..028ecd0e690 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -80,18 +80,6 @@ fn test_nonexisting_file() { .stderr_contains(format!("cksum: {file_name}: No such file or directory")); } -#[test] -fn test_folder() { - let (at, mut ucmd) = at_and_ucmd!(); - - let folder_name = "a_folder"; - at.mkdir(folder_name); - - ucmd.arg(folder_name) - .succeeds() - .stdout_only(format!("4294967295 0 {folder_name}\n")); -} - // Make sure crc is correct for files larger than 32 bytes // but <128 bytes (1 fold pclmul) // spell-checker:disable-line #[test] @@ -288,15 +276,34 @@ fn test_length_is_zero() { } #[test] -fn test_blake2b_fail_on_directory() { +fn test_fail_on_folder() { let (at, mut ucmd) = at_and_ucmd!(); let folder_name = "a_folder"; at.mkdir(folder_name); - ucmd.arg("--algorithm=blake2b") - .arg(folder_name) + ucmd.arg(folder_name) .fails() .no_stdout() .stderr_contains(format!("cksum: {folder_name}: Is a directory")); } + +#[test] +fn test_all_algorithms_fail_on_folder() { + let scene = TestScenario::new(util_name!()); + + let at = &scene.fixtures; + + let folder_name = "a_folder"; + at.mkdir(folder_name); + + for algo in ALGOS { + scene + .ucmd() + .arg(format!("--algorithm={algo}")) + .arg(folder_name) + .fails() + .no_stdout() + .stderr_contains(format!("cksum: {folder_name}: Is a directory")); + } +} From 1e1ee5ff7a37ee42f17d79f01ddd55ff55a1b6cb Mon Sep 17 00:00:00 2001 From: Atomei Alexandru Constantin Date: Thu, 11 Jan 2024 21:59:30 +0200 Subject: [PATCH 3/3] Made cksum work on more than one item if it fails and added a test for this case --- src/uu/cksum/src/cksum.rs | 16 ++++++++-------- tests/by-util/test_cksum.rs | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index f043caec19a..458177e8a7c 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -15,8 +15,8 @@ use std::io::{self, stdin, stdout, BufReader, Read, Write}; use std::iter; use std::path::Path; use uucore::{ - error::{FromIo, UError, UResult}, - format_usage, help_about, help_section, help_usage, + error::{FromIo, UError, UResult, USimpleError}, + format_usage, help_about, help_section, help_usage, show, sum::{ div_ceil, Blake2b, Digest, DigestWriter, Md5, Sha1, Sha224, Sha256, Sha384, Sha512, Sm3, BSD, CRC, SYSV, @@ -175,12 +175,12 @@ where let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) .map_err_context(|| "failed to read input".to_string())?; if filename.is_dir() { - return Err(io::Error::new( - io::ErrorKind::InvalidInput, - format!("{}: Is a directory", filename.display()), - ) - .into()); - + show!(USimpleError::new( + 1, + format!("{}: Is a directory", filename.display()) + )); + continue; + } if options.raw { let bytes = match options.algo_name { ALGORITHM_OPTIONS_CRC => sum.parse::().unwrap().to_be_bytes().to_vec(), diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index ab38b5e16d2..80cfc749931 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -331,3 +331,21 @@ fn test_all_algorithms_fail_on_folder() { .stderr_contains(format!("cksum: {folder_name}: Is a directory")); } } + +#[test] +fn test_folder_and_file() { + let scene = TestScenario::new(util_name!()); + + let at = &scene.fixtures; + + let folder_name = "a_folder"; + at.mkdir(folder_name); + + scene + .ucmd() + .arg(folder_name) + .arg("lorem_ipsum.txt") + .fails() + .stderr_contains(format!("cksum: {folder_name}: Is a directory")) + .stdout_is_fixture("crc_single_file.expected"); +}