md5sum, sha1sum, etc: handle invalid input (i.e., don't segfault)
authorJim Meyering <meyering@redhat.com>
Tue, 15 Apr 2008 06:19:11 +0000 (08:19 +0200)
committerJim Meyering <meyering@redhat.com>
Tue, 15 Apr 2008 06:46:48 +0000 (08:46 +0200)
* src/md5sum.c (bsd_split_3): Return right away if s_len == 0.
* tests/misc/md5sum (bsd-segv): New test for the above.
* tests/misc/sha1sum (bsd-segv): Likewise.
* NEWS: Mention the bug fix.
Reported by Cristian Cadar, Daniel Dunbar and Dawson Engler.

NEWS
src/md5sum.c
tests/misc/md5sum
tests/misc/sha1sum

diff --git a/NEWS b/NEWS
index e208b30b8854b96eeeadeb48c396cc1cc2315a14..3a584e9cc301b9cf2ef4f40d733c04b281cc021a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,11 @@ GNU coreutils NEWS                                    -*- outline -*-
   ls no longer segfaults on files in /proc when linked with an older version
   of libselinux.  E.g., ls -l /proc/sys would dereference a NULL pointer.
 
+  md5sum would segfault for invalid BSD-style input, e.g.,
+  echo 'MD5 (' | md5sum -c -  Now, md5sum ignores that line.
+  sha1sum, sha224sum, sha384sum, and sha512sum are affected, too.
+  [bug introduced in coreutils-5.1.0]
+
   "mkdir -Z x dir" no longer segfaults when diagnosing invalid context "x"
   mkfifo and mknod would fail similarly.  Now they're fixed.
 
index 28bde99097b0e10a6a57f281878cbf4a8d5dbbe8..5eb8494b0818f683a608fd9df195da97836ca39f 100644 (file)
@@ -1,5 +1,5 @@
 /* Compute MD5, SHA1, SHA224, SHA256, SHA384 or SHA512 checksum of files or strings
-   Copyright (C) 1995-2007 Free Software Foundation, Inc.
+   Copyright (C) 1995-2008 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -205,6 +205,9 @@ bsd_split_3 (char *s, size_t s_len, unsigned char **hex_digest, char **file_name
 {
   size_t i;
 
+  if (s_len == 0)
+    return false;
+
   *file_name = s;
 
   /* Find end of filename. The BSD 'md5' and 'sha1' commands do not escape
index ca23d9432bcc142795ac327c6c0e4014793ad28d..25069fd1575f89ab0d45fe68736be656cf66dcc1 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # Basic tests for "md5sum".
 
-# Copyright (C) 1998, 1999, 2003, 2005, 2007 Free Software Foundation, Inc.
+# Copyright (C) 1998-1999, 2003, 2005, 2007-2008 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@ exec $PERL -w -I$srcdir/.. -MCoreutils -M"CuTmpdir qw($me)" -- - <<\EOF
 require 5.003;
 use strict;
 
-(my $program_name = $0) =~ s|.*/||;
+my $prog = 'md5sum';
 
 # Turn off localisation of executable's ouput.
 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@@ -64,6 +64,8 @@ my @Tests =
      ['check-bsd3', '--check', '--status',
                                {IN=> {'f.md5' => "MD5 (f) = $degenerate\n"}},
                                {AUX=> {f=> 'bar'}}, {EXIT=> 1}],
+     ['bsd-segv', '--check', {IN=> {'z' => "MD5 ("}}, {EXIT=> 1},
+      {ERR=> "$prog: z: no properly formatted MD5 checksum lines found\n"}],
     );
 
 # Insert the `--text' argument for each test.
@@ -76,7 +78,6 @@ foreach $t (@Tests)
 my $save_temps = $ENV{DEBUG};
 my $verbose = $ENV{VERBOSE};
 
-my $prog = 'md5sum';
-my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose);
+my $fail = run_tests ($prog, $prog, \@Tests, $save_temps, $verbose);
 exit $fail;
 EOF
index b7d288fa24b052fa7237eef76599f3772539f8a6..452236d8d12794d7c246fab09551dbae72fc75bf 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # Test "sha1sum".
 
-# Copyright (C) 2000, 2003, 2005-2007 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2003, 2005-2008 Free Software Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@ exec $PERL -w -I$srcdir/.. -MCoreutils -M"CuTmpdir qw($me)" -- - <<\EOF
 require 5.003;
 use strict;
 
-(my $program_name = $0) =~ s|.*/||;
+my $prog = 'sha1sum';
 
 # Turn off localisation of executable's ouput.
 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@@ -66,6 +66,8 @@ my @Tests =
      ['check-bsd3', '--check', '--status',
                        {IN=> {'f.sha1' => "SHA1 (f) = $sha_degenerate\n"}},
                        {AUX=> {f=> 'bar'}}, {EXIT=> 1}],
+     ['bsd-segv', '--check', {IN=> {'z' => "SHA1 ("}}, {EXIT=> 1},
+      {ERR=> "$prog: z: no properly formatted SHA1 checksum lines found\n"}],
     );
 
 # Insert the `--text' argument for each test.
@@ -78,7 +80,6 @@ foreach $t (@Tests)
 my $save_temps = $ENV{DEBUG};
 my $verbose = $ENV{VERBOSE};
 
-my $prog = 'sha1sum';
-my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose);
+my $fail = run_tests ($prog, $prog, \@Tests, $save_temps, $verbose);
 exit $fail;
 EOF