From a402b5e3a5cd7d8a68d668b07021528490752621 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Tue, 8 Apr 2025 20:10:21 +0200 Subject: [PATCH 1/2] mcookie: fix max size option --- src/uu/mcookie/src/mcookie.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/uu/mcookie/src/mcookie.rs b/src/uu/mcookie/src/mcookie.rs index 843f05b..997ca22 100644 --- a/src/uu/mcookie/src/mcookie.rs +++ b/src/uu/mcookie/src/mcookie.rs @@ -29,6 +29,9 @@ mod options { const ABOUT: &str = help_about!("mcookie.md"); const USAGE: &str = help_usage!("mcookie.md"); +const RANDOM_BYTES: usize = 128; +const MAX_DEFAULT: u64 = 4096; + #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches: clap::ArgMatches = uu_app().try_get_matches_from(args)?; @@ -43,13 +46,19 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let max_size = if let Some(size_str) = matches.get_one::(options::MAX_SIZE) { match Size::parse(size_str) { - Ok(size) => Some(size.size_bytes()), + Ok(size) => { + let mut s = size.size_bytes(); + if s == 0 { + s = MAX_DEFAULT; + } + Some(s) + } Err(_) => { return Err(USimpleError::new(1, "Failed to parse max-size value")); } } } else { - None + Some(MAX_DEFAULT) }; let mut hasher = Md5::new(); @@ -107,7 +116,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { hasher.update(&buffer); } - const RANDOM_BYTES: usize = 128; let mut rng = rand::rng(); let mut rand_bytes = [0u8; RANDOM_BYTES]; rng.fill_bytes(&mut rand_bytes); From 1a5896c3be4fe2d3aed815ea3ccd7aac67e69da1 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Tue, 8 Apr 2025 20:12:48 +0200 Subject: [PATCH 2/2] mcookie: fix and add tests --- tests/by-util/test_mcookie.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/by-util/test_mcookie.rs b/tests/by-util/test_mcookie.rs index 5260340..a84e73f 100644 --- a/tests/by-util/test_mcookie.rs +++ b/tests/by-util/test_mcookie.rs @@ -79,7 +79,7 @@ fn test_char_device_input() { .arg("/dev/zero") .succeeds(); - res_verbose.stderr_contains("Got 1024 bytes from /dev/zero"); + res_verbose.stderr_contains("Got 4096 bytes from /dev/zero"); res_verbose.stderr_contains("Got 128 bytes from randomness source"); // Ensure internal randomness is still added let stdout_verbose = res_verbose.stdout_str().trim_end(); @@ -177,3 +177,36 @@ fn test_not_existing_file() { file2.path().to_str().unwrap() )); } + +#[test] +fn test_max_size_limits() { + let mut file = NamedTempFile::new().unwrap(); + const CONTENT: [u8; 5500] = [1; 5500]; + file.write_all(&CONTENT).unwrap(); + + let res_default = new_ucmd!() + .arg("--verbose") + .arg("-f") + .arg(file.path()) + .succeeds(); + + // Ensure we only read up to 4096 bytes + res_default.stderr_contains(format!( + "Got 4096 bytes from {}", + file.path().to_str().unwrap() + )); + + let res_zero = new_ucmd!() + .arg("--verbose") + .arg("-f") + .arg(file.path()) + .arg("-m") + .arg("0") + .succeeds(); + + // Ensure we read up 4096 bytes + res_zero.stderr_contains(format!( + "Got 4096 bytes from {}", + file.path().to_str().unwrap() + )); +}