Skip to content

Commit 0f5cfbd

Browse files
committed
cksum: Fix --check filename escaping for 9.11
1 parent 20f7af8 commit 0f5cfbd

3 files changed

Lines changed: 39 additions & 48 deletions

File tree

src/uucore/src/lib/features/checksum/validate.rs

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -241,16 +241,16 @@ impl Display for FileChecksumResult {
241241
/// name might contain non-utf-8 characters.
242242
fn write_file_report<W: Write>(
243243
mut w: W,
244-
filename: &[u8],
244+
filename: &OsStr,
245245
result: FileChecksumResult,
246-
prefix: &str,
247246
verbose: ChecksumVerbose,
248-
) {
247+
) -> io::Result<()> {
249248
if result.can_display(verbose) {
250-
let _ = write!(w, "{prefix}");
251-
let _ = w.write_all(filename);
252-
let _ = writeln!(w, ": {result}");
249+
let filename = locale_aware_escape_name(filename, QuotingStyle::SHELL_ESCAPE);
250+
// Here, .to_string_lossy() is lossless thanks to the escaping.
251+
writeln!(w, "{}: {result}", filename.to_string_lossy())?;
253252
}
253+
Ok(())
254254
}
255255

256256
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
@@ -543,17 +543,14 @@ fn get_file_to_check(
543543
filename: &OsStr,
544544
opts: ChecksumValidateOptions,
545545
) -> Result<Box<dyn Read>, LineCheckError> {
546-
let filename_bytes = os_str_as_bytes(filename).map_err(|e| LineCheckError::UError(e.into()))?;
547-
548546
if filename == "-" {
549547
Ok(Box::new(stdin())) // Use stdin if "-" is specified in the checksum file
550548
} else {
551549
let failed_open = || {
552-
write_file_report(
550+
let _ = write_file_report(
553551
io::stdout(),
554-
filename_bytes,
552+
filename,
555553
FileChecksumResult::CantOpen,
556-
"",
557554
opts.verbose,
558555
);
559556
};
@@ -686,7 +683,7 @@ fn compute_and_check_digest_from_file(
686683
algo: SizedAlgoKind,
687684
opts: ChecksumValidateOptions,
688685
) -> Result<(), LineCheckError> {
689-
let (filename_to_check_unescaped, prefix) = unescape_filename(filename);
686+
let (filename_to_check_unescaped, _prefix) = unescape_filename(filename);
690687
let real_filename_to_check = os_str_from_bytes(&filename_to_check_unescaped)?;
691688

692689
// Open the input file
@@ -708,11 +705,10 @@ fn compute_and_check_digest_from_file(
708705
.to_string()
709706
}));
710707

711-
write_file_report(
708+
let _ = write_file_report(
712709
io::stdout(),
713-
filename,
710+
&real_filename_to_check,
714711
FileChecksumResult::CantOpen,
715-
prefix,
716712
opts.verbose,
717713
);
718714
return Err(LineCheckError::CantOpenFile);
@@ -725,11 +721,10 @@ fn compute_and_check_digest_from_file(
725721
DigestOutput::Crc(n) => n.to_be_bytes() == expected_checksum,
726722
DigestOutput::U16(n) => n.to_be_bytes() == expected_checksum,
727723
};
728-
write_file_report(
724+
let _ = write_file_report(
729725
io::stdout(),
730-
filename,
726+
&real_filename_to_check,
731727
FileChecksumResult::from_bool(checksum_correct),
732-
prefix,
733728
opts.verbose,
734729
);
735730

@@ -1278,37 +1273,33 @@ mod tests {
12781273
fn test_write_file_report() {
12791274
let opts = ChecksumValidateOptions::default();
12801275

1281-
let cases: &[(&[u8], FileChecksumResult, &str, &[u8])] = &[
1282-
(b"filename", FileChecksumResult::Ok, "", b"filename: OK\n"),
1276+
let cases: &[(OsString, FileChecksumResult, &[u8])] = &[
1277+
(
1278+
OsString::from("filename"),
1279+
FileChecksumResult::Ok,
1280+
b"filename: OK\n",
1281+
),
12831282
(
1284-
b"filename",
1283+
OsString::from("filename"),
12851284
FileChecksumResult::Failed,
1286-
"",
12871285
b"filename: FAILED\n",
12881286
),
12891287
(
1290-
b"filename",
1288+
OsString::from("filename"),
12911289
FileChecksumResult::CantOpen,
1292-
"",
12931290
b"filename: FAILED open or read\n",
12941291
),
12951292
(
1296-
b"filename",
1297-
FileChecksumResult::Ok,
1298-
"prefix",
1299-
b"prefixfilename: OK\n",
1300-
),
1301-
(
1302-
b"funky\xffname",
1293+
#[allow(clippy::unwrap_used, reason = "deterministic unwrap does not fail")]
1294+
os_str_from_bytes(b"funky\xffname").unwrap().to_os_string(),
13031295
FileChecksumResult::Ok,
1304-
"",
1305-
b"funky\xffname: OK\n",
1296+
b"'funky'$'\\377''name': OK\n",
13061297
),
13071298
];
13081299

1309-
for (filename, result, prefix, expected) in cases {
1300+
for (filename, result, expected) in cases {
13101301
let mut buffer: Vec<u8> = vec![];
1311-
write_file_report(&mut buffer, filename, *result, prefix, opts.verbose);
1302+
let _ = write_file_report(&mut buffer, filename, *result, opts.verbose);
13121303
assert_eq!(&buffer, expected);
13131304
}
13141305
}

tests/by-util/test_cksum.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1972,7 +1972,7 @@ mod check_encoding {
19721972
.arg("--check")
19731973
.arg(at.subdir.join("check"))
19741974
.succeeds()
1975-
.stdout_is_bytes(b"funky\xffname: OK\n")
1975+
.stdout_is_bytes(b"'funky'$'\\377''name': OK\n")
19761976
.no_stderr();
19771977

19781978
// Checksum mismatch
@@ -1983,7 +1983,7 @@ mod check_encoding {
19831983
.arg("--check")
19841984
.arg(at.subdir.join("check"))
19851985
.fails()
1986-
.stdout_is_bytes(b"funky\xffname: FAILED\n")
1986+
.stdout_is_bytes(b"'funky'$'\\377''name': FAILED\n")
19871987
.stderr_contains("1 computed checksum did NOT match");
19881988

19891989
// file not found
@@ -1994,7 +1994,7 @@ mod check_encoding {
19941994
.arg("--check")
19951995
.arg(at.subdir.join("check"))
19961996
.fails()
1997-
.stdout_is_bytes(b"flakey\xffname: FAILED open or read\n")
1997+
.stdout_is_bytes(b"'flakey'$'\\377''name': FAILED open or read\n")
19981998
.stderr_contains("1 listed file could not be read");
19991999
}
20002000

@@ -2015,8 +2015,8 @@ mod check_encoding {
20152015
cmd.arg("-c")
20162016
.arg("check")
20172017
.fails_with_code(1)
2018-
.stdout_contains_bytes(b"FFF\xffFFF: FAILED open or read")
2019-
.stdout_contains_bytes(b"FFF\xffDIR: FAILED open or read")
2018+
.stdout_contains_bytes(b"'FFF'$'\\377''FFF': FAILED open or read")
2019+
.stdout_contains_bytes(b"'FFF'$'\\377''DIR': FAILED open or read")
20202020
.stderr_contains("'FFF'$'\\377''FFF': No such file or directory")
20212021
.stderr_contains("'FFF'$'\\377''DIR': Is a directory");
20222022
}

tests/by-util/test_md5sum.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ fn test_check_md5sum() {
164164
.arg("-c")
165165
.arg("check.md5sum")
166166
.succeeds()
167-
.stdout_is("a: OK\n b: OK\n*c: OK\ndd: OK\n : OK\n")
167+
.stdout_is("a: OK\n' b': OK\n'*c': OK\ndd: OK\n' ': OK\n")
168168
.stderr_is("");
169169
}
170170
#[cfg(windows)]
@@ -184,7 +184,7 @@ fn test_check_md5sum() {
184184
.arg("-c")
185185
.arg("check.md5sum")
186186
.succeeds()
187-
.stdout_is("a: OK\n b: OK\ndd: OK\n")
187+
.stdout_is("a: OK\n' b': OK\ndd: OK\n")
188188
.stderr_is("");
189189
}
190190
}
@@ -210,7 +210,7 @@ fn test_check_md5sum_only_one_space() {
210210
.arg("-c")
211211
.arg("check.md5sum")
212212
.succeeds()
213-
.stdout_only("a: OK\n b: OK\nc: OK\n");
213+
.stdout_only("a: OK\n' b': OK\nc: OK\n");
214214
}
215215

216216
#[test]
@@ -237,7 +237,7 @@ fn test_check_md5sum_reverse_bsd() {
237237
.arg("-c")
238238
.arg("check.md5sum")
239239
.succeeds()
240-
.stdout_is("a: OK\n b: OK\n*c: OK\ndd: OK\n : OK\n")
240+
.stdout_is("a: OK\n' b': OK\n'*c': OK\ndd: OK\n' ': OK\n")
241241
.stderr_is("");
242242
}
243243
#[cfg(windows)]
@@ -257,7 +257,7 @@ fn test_check_md5sum_reverse_bsd() {
257257
.arg("-c")
258258
.arg("check.md5sum")
259259
.succeeds()
260-
.stdout_is("a: OK\n b: OK\ndd: OK\n")
260+
.stdout_is("a: OK\n' b': OK\ndd: OK\n")
261261
.stderr_is("");
262262
}
263263
}
@@ -384,7 +384,7 @@ fn test_check_with_escape_filename() {
384384
.arg("-c")
385385
.arg("check.md5")
386386
.succeeds();
387-
result.stdout_is("\\a\\nb: OK\n");
387+
result.stdout_is("'a'$'\\n''b': OK\n");
388388
}
389389

390390
#[test]
@@ -510,7 +510,7 @@ fn test_check_one_two_space_star() {
510510
.arg("--check")
511511
.arg(at.subdir.join("in.md5"))
512512
.fails()
513-
.stdout_is("*empty: FAILED open or read\n");
513+
.stdout_is("'*empty': FAILED open or read\n");
514514

515515
at.touch("*empty");
516516
// Should pass as we have the file
@@ -519,7 +519,7 @@ fn test_check_one_two_space_star() {
519519
.arg("--check")
520520
.arg(at.subdir.join("in.md5"))
521521
.succeeds()
522-
.stdout_is("*empty: OK\n");
522+
.stdout_is("'*empty': OK\n");
523523
}
524524

525525
#[test]

0 commit comments

Comments
 (0)