From d154c21a09369d08f16a9cdf71e00ccfe55c9ef7 Mon Sep 17 00:00:00 2001 From: Josh French Date: Mon, 30 Mar 2026 12:56:43 -0700 Subject: [PATCH 1/3] Fix an error in how cksum parses checksum files When cksum (or sha256sum, etc...) attempts to parse chekcusm files in the "tagged output format" and it encounters the string "((", it crashes due to an error in how it parses the checksum file. GNU coreutils, by contrast, correctly recognizes this string as a syntax error and ignores the line. --- src/uucore/src/lib/features/checksum/validate.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/uucore/src/lib/features/checksum/validate.rs b/src/uucore/src/lib/features/checksum/validate.rs index bb47ff6c920..c226c926699 100644 --- a/src/uucore/src/lib/features/checksum/validate.rs +++ b/src/uucore/src/lib/features/checksum/validate.rs @@ -281,6 +281,9 @@ impl LineFormat { // tagged format does not put a space before (filename) let par_idx = rest.iter().position(|&b| b == b'(')?; + if par_idx < 1 { + return None; + } let sub_case = if rest[par_idx - 1] == b' ' { SubCase::Posix } else { From f3d5f3813f551ad24c9dc398dfcc1e1ddd0892da Mon Sep 17 00:00:00 2001 From: Josh French Date: Sun, 5 Apr 2026 20:41:40 -0700 Subject: [PATCH 2/3] cksum: Add tests to fix issue with cksum parser The 'cksum' (sha256sum, etc...) parser panic when parsing files in the "tagged output format If it encounters a line that does not contain an algorithm name (MD5, SHA256, etc...) Fix this, so that it reports a syntax error like GNU does, and test for it. --- .../src/lib/features/checksum/validate.rs | 5 +++++ tests/by-util/test_cksum.rs | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/uucore/src/lib/features/checksum/validate.rs b/src/uucore/src/lib/features/checksum/validate.rs index c226c926699..04c13c8a808 100644 --- a/src/uucore/src/lib/features/checksum/validate.rs +++ b/src/uucore/src/lib/features/checksum/validate.rs @@ -1027,6 +1027,7 @@ mod tests { #[test] fn test_algo_based_parser() { #[allow(clippy::type_complexity)] + // Tuple format: (input line, option(algo name, option(algo bit size), filename, checksum) let test_cases: &[(&[u8], Option<(&[u8], Option<&[u8]>, &[u8], &[u8])>)] = &[ (b"SHA256 (example.txt) = d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2", Some((b"SHA256", None, b"example.txt", b"d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2"))), // cspell:disable @@ -1044,6 +1045,10 @@ mod tests { (b" MD5(weirdfilename6) = ) = fds65dsf46as5df4d6f54asds5d7f7g9", None), (b" MD5 (weirdfilename7)= )= fds65dsf46as5df4d6f54asds5d7f7g9", None), (b" MD5 (weirdfilename8) = )= fds65dsf46as5df4d6f54asds5d7f7g9", None), + // test that missing algorithm + (b"(filename) = fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b"filename) = fds65dsf46as5df4d6f54asds5d7f7g9", None), + (b"filename = fds65dsf46as5df4d6f54asds5d7f7g9", None), ]; // cspell:enable diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 16ed6d8b373..b80d0a99456 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -627,6 +627,24 @@ fn test_check_sha2_tagged_missing_hint() { .stderr_contains("no properly formatted checksum lines found"); } +#[test] +fn test_check_tagged_missing_algo() { + // When checking tagged lines, if the algorithm is missing, raise "improperly + // formatted" rather than a failed check. + + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("a"); + + let invalid1 = "(a) = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; + let invalid2 = "a) = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; + let invalid3 = "(a = d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; + + ucmd.arg("-c") + .pipe_in(format!("{invalid1}\n{invalid2}\n{invalid3}")) + .fails() + .stderr_contains("no properly formatted checksum lines found"); +} + #[rstest] #[case::md5("md5", "d41d8cd98f00b204e9800998ecf8427e")] #[case::sha1("sha1", "da39a3ee5e6b4b0d3255bfef95601890afd80709")] From 0858fdd10158e170ecf6218e43efac966a3f4e32 Mon Sep 17 00:00:00 2001 From: Josh French Date: Mon, 6 Apr 2026 09:49:05 -0700 Subject: [PATCH 3/3] Correct typo in comment in validate.rs Correct a typo in a comment in test_algo_based_parser test function. --- src/uucore/src/lib/features/checksum/validate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uucore/src/lib/features/checksum/validate.rs b/src/uucore/src/lib/features/checksum/validate.rs index 04c13c8a808..f755d5283d1 100644 --- a/src/uucore/src/lib/features/checksum/validate.rs +++ b/src/uucore/src/lib/features/checksum/validate.rs @@ -1045,7 +1045,7 @@ mod tests { (b" MD5(weirdfilename6) = ) = fds65dsf46as5df4d6f54asds5d7f7g9", None), (b" MD5 (weirdfilename7)= )= fds65dsf46as5df4d6f54asds5d7f7g9", None), (b" MD5 (weirdfilename8) = )= fds65dsf46as5df4d6f54asds5d7f7g9", None), - // test that missing algorithm + // test for missing algorithm (b"(filename) = fds65dsf46as5df4d6f54asds5d7f7g9", None), (b"filename) = fds65dsf46as5df4d6f54asds5d7f7g9", None), (b"filename = fds65dsf46as5df4d6f54asds5d7f7g9", None),