>From 65861779310825e36e8a0ce54f3c816167bc36ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 23 Nov 2015 17:11:26 +0000 Subject: [PATCH] md5sum,sha*sum: ensure --ignore-missing fails when no files verified * src/md5sum.c (digest_check): Update a matched_checksums bool upon matched checksum and fail (loudly unless --status is specified) if there were no matches. Also change properly_formatted_lines to a bool while at it since we don't need to track the number. * tests/misc/md5sum.pl: Add a test case. Suggested by Jim Meyering. --- src/md5sum.c | 16 ++++++++++++---- tests/misc/md5sum.pl | 6 ++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/md5sum.c b/src/md5sum.c index 49da8ed..67b2fbc 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -523,10 +523,11 @@ digest_check (const char *checkfile_name) { FILE *checkfile_stream; uintmax_t n_misformatted_lines = 0; - uintmax_t n_properly_formatted_lines = 0; uintmax_t n_improperly_formatted_lines = 0; uintmax_t n_mismatched_checksums = 0; uintmax_t n_open_or_read_failures = 0; + bool properly_formatted_lines = false; + bool matched_checksums = false; unsigned char bin_buffer_unaligned[DIGEST_BIN_BYTES + DIGEST_ALIGN]; /* Make sure bin_buffer is properly aligned. */ unsigned char *bin_buffer = ptr_align (bin_buffer_unaligned, DIGEST_ALIGN); @@ -606,7 +607,7 @@ digest_check (const char *checkfile_name) to ease automatic processing of status output. */ bool needs_escape = ! status_only && strchr (filename, '\n'); - ++n_properly_formatted_lines; + properly_formatted_lines = true; *bin_buffer = '\1'; /* flag set to 0 for ignored missing files. */ ok = digest_file (filename, &binary, bin_buffer); @@ -645,6 +646,8 @@ digest_check (const char *checkfile_name) } if (cnt != digest_bin_bytes) ++n_mismatched_checksums; + else + matched_checksums = true; if (!status_only) { @@ -679,7 +682,7 @@ digest_check (const char *checkfile_name) return false; } - if (n_properly_formatted_lines == 0) + if (! properly_formatted_lines) { /* Warn if no tests are found. */ error (0, 0, _("%s: no properly formatted %s checksum lines found"), @@ -712,10 +715,15 @@ digest_check (const char *checkfile_name) "WARNING: %" PRIuMAX " computed checksums did NOT match", select_plural (n_mismatched_checksums))), n_mismatched_checksums); + + if (ignore_missing && ! matched_checksums) + error (0, 0, _("%s: no files were verified"), + quotef (checkfile_name)); } } - return (n_properly_formatted_lines != 0 + return (properly_formatted_lines + && matched_checksums && n_mismatched_checksums == 0 && n_open_or_read_failures == 0 && (!strict || n_improperly_formatted_lines == 0)); diff --git a/tests/misc/md5sum.pl b/tests/misc/md5sum.pl index 3a7744b..92c60f6 100755 --- a/tests/misc/md5sum.pl +++ b/tests/misc/md5sum.pl @@ -143,6 +143,12 @@ my @Tests = "meaningful only when verifying checksums\n". $try_help}, {EXIT=> 1}], + ['check-ignore-missing-5', '--check', '--ignore-missing', + {AUX=> {f=> ''}}, + {IN=> {'f.md5' => "$degenerate missing\n"}}, + {ERR=> + "md5sum: f.md5: no files were verified\n"}, + {EXIT=> 1}], ['bsd-segv', '--check', {IN=> {'z' => "MD5 ("}}, {EXIT=> 1}, {ERR=> "$prog: z: no properly formatted MD5 checksum lines found\n"}], -- 2.5.0