Skip to content

Commit 214bc1c

Browse files
committed
hashsum: don't fail on os errors
1 parent 4c68e1e commit 214bc1c

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed

src/uu/hashsum/src/hashsum.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use uucore::checksum::detect_algo;
2525
use uucore::checksum::digest_reader;
2626
use uucore::checksum::escape_filename;
2727
use uucore::checksum::perform_checksum_validation;
28-
use uucore::error::{FromIo, UResult};
28+
use uucore::error::{UResult, strip_errno};
2929
use uucore::format_usage;
3030
use uucore::sum::{Digest, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Shake128, Shake256};
3131
use uucore::translate;
@@ -552,9 +552,10 @@ where
552552
Ok(f) => f,
553553
Err(e) => {
554554
eprintln!(
555-
"{}: {}: {e}",
555+
"{}: {}: {}",
556556
options.binary_name,
557-
filename.to_string_lossy()
557+
filename.to_string_lossy(),
558+
strip_errno(&e)
558559
);
559560
err_found = Some(ChecksumError::Io(e));
560561
continue;
@@ -564,13 +565,25 @@ where
564565
},
565566
);
566567

567-
let (sum, _) = digest_reader(
568+
let sum = match digest_reader(
568569
&mut options.digest,
569570
&mut file,
570571
options.binary,
571572
options.output_bits,
572-
)
573-
.map_err_context(|| translate!("hashsum-error-failed-to-read-input"))?;
573+
) {
574+
Ok((sum, _)) => sum,
575+
Err(e) => {
576+
eprintln!(
577+
"{}: {}: {}",
578+
options.binary_name,
579+
filename.to_string_lossy(),
580+
strip_errno(&e)
581+
);
582+
err_found = Some(ChecksumError::Io(e));
583+
continue;
584+
}
585+
};
586+
574587
let (escaped_filename, prefix) = escape_filename(filename);
575588
if options.tag {
576589
if options.algoname == "blake2b" {

tests/by-util/test_hashsum.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,38 @@ fn test_check_directory_error() {
872872
.stderr_contains(err_msg);
873873
}
874874

875+
#[test]
876+
#[cfg(not(windows))]
877+
fn test_continue_after_directory_error() {
878+
let scene = TestScenario::new(util_name!());
879+
let at = &scene.fixtures;
880+
881+
at.mkdir("d");
882+
at.touch("file");
883+
at.touch("no_read_perms");
884+
at.set_mode("no_read_perms", 200);
885+
886+
let (out, err_msg) = (
887+
"d41d8cd98f00b204e9800998ecf8427e file\n",
888+
[
889+
"md5sum: d: Is a directory",
890+
"md5sum: dne: No such file or directory",
891+
"md5sum: no_read_perms: Permission denied\n",
892+
]
893+
.join("\n"),
894+
);
895+
896+
scene
897+
.ccmd("md5sum")
898+
.arg("d")
899+
.arg("dne")
900+
.arg("no_read_perms")
901+
.arg("file")
902+
.fails()
903+
.stdout_is(out)
904+
.stderr_is(err_msg);
905+
}
906+
875907
#[test]
876908
fn test_check_quiet() {
877909
let scene = TestScenario::new(util_name!());

0 commit comments

Comments
 (0)