]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
md5sum,sha*sum: ensure --ignore-missing fails when no file verified
authorPádraig Brady <P@draigBrady.com>
Mon, 23 Nov 2015 17:11:26 +0000 (17:11 +0000)
committerPádraig Brady <P@draigBrady.com>
Mon, 23 Nov 2015 18:06:38 +0000 (18:06 +0000)
* 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 plurality.
* tests/misc/md5sum.pl: Add a test case.
Suggested by Jim Meyering.

src/md5sum.c
tests/misc/md5sum.pl

index 49da8edc42b775058e6ad3cd2748f3edb7e0a4a2..b7de98ec6e0e1cb8411697b81d639ce1d599c70b 100644 (file)
@@ -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 file was 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));
index 3a7744bde95019f751479385bb5f8986815fee6c..40f56077d1b8929579db453328e711f665c707a2 100755 (executable)
@@ -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 file was verified\n"},
+                                {EXIT=> 1}],
      ['bsd-segv', '--check', {IN=> {'z' => "MD5 ("}}, {EXIT=> 1},
       {ERR=> "$prog: z: no properly formatted MD5 checksum lines found\n"}],