diff options
-rw-r--r-- | src/md5sum.c | 29 | ||||
-rwxr-xr-x | tests/misc/md5sum.pl | 4 | ||||
-rwxr-xr-x | tests/misc/sha1sum.pl | 4 |
3 files changed, 28 insertions, 9 deletions
diff --git a/src/md5sum.c b/src/md5sum.c index b43781150..bf7eb81a6 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -657,11 +657,17 @@ digest_check (const char *checkfile_name) && (!strict || n_improperly_formatted_lines == 0)); } +/* If ESCAPE is true, then translate each NEWLINE byte to the string, "\\n", + and each backslash to "\\\\". */ static void -print_filename (char const *file) +print_filename (char const *file, bool escape) { - /* Translate each NEWLINE byte to the string, "\\n", - and each backslash to "\\\\". */ + if (! escape) + { + fputs (file, stdout); + return; + } + while (*file) { switch (*file) @@ -823,14 +829,23 @@ main (int argc, char **argv) ok = false; else { + /* We don't really need to escape, and hence detect, the '\\' + char, and not doing so should be both forwards and backwards + compatible, since only escaped lines would have a '\\' char at + the start. However just in case users are directly comparing + against old (hashed) outputs, in the presence of files + containing '\\' characters, we decided to not simplify the + output in this case. */ + bool needs_escape = strchr (file, '\\') || strchr (file, '\n'); + if (prefix_tag) { - if (strchr (file, '\n') || strchr (file, '\\')) + if (needs_escape) putchar ('\\'); fputs (DIGEST_TYPE_STRING, stdout); fputs (" (", stdout); - print_filename (file); + print_filename (file, needs_escape); fputs (") = ", stdout); } @@ -838,7 +853,7 @@ main (int argc, char **argv) /* Output a leading backslash if the file name contains a newline or backslash. */ - if (!prefix_tag && (strchr (file, '\n') || strchr (file, '\\'))) + if (!prefix_tag && needs_escape) putchar ('\\'); for (i = 0; i < (digest_hex_bytes / 2); ++i) @@ -850,7 +865,7 @@ main (int argc, char **argv) putchar (file_is_binary ? '*' : ' '); - print_filename (file); + print_filename (file, needs_escape); } putchar ('\n'); diff --git a/tests/misc/md5sum.pl b/tests/misc/md5sum.pl index 5192d55f4..a89fa62cc 100755 --- a/tests/misc/md5sum.pl +++ b/tests/misc/md5sum.pl @@ -38,7 +38,9 @@ my @Tests = {OUT=>"d174ab98d277d9f5a5611c2c9f419d9f f\n"}], ['7', {IN=> {f=> '1234567890' x 8}}, {OUT=>"57edf4a22be3c955ac49da2e2107b67a f\n"}], - ['backslash', {IN=> {".\\foo"=> ''}}, + ['backslash-1', {IN=> {".\nfoo"=> ''}}, + {OUT=>"\\$degenerate .\\nfoo\n"}], + ['backslash-2', {IN=> {".\\foo"=> ''}}, {OUT=>"\\$degenerate .\\\\foo\n"}], ['check-1', '--check', {AUX=> {f=> ''}}, {IN=> {'f.md5' => "$degenerate f\n"}}, diff --git a/tests/misc/sha1sum.pl b/tests/misc/sha1sum.pl index 327c4dd89..730ca0804 100755 --- a/tests/misc/sha1sum.pl +++ b/tests/misc/sha1sum.pl @@ -44,7 +44,9 @@ my @Tests = {OUT=>"50abf5706a150990a08b2c5ea40fa0e585554732 f\n"}], ['million-a', {IN=> {f=> 'a' x 1000000}}, {OUT=>"34aa973cd4c4daa4f61eeb2bdbad27316534016f f\n"}], - ['bs-sha', {IN=> {".\\foo"=> ''}}, + ['bs-sha-1', {IN=> {".\nfoo"=> ''}}, + {OUT=>"\\$sha_degenerate .\\nfoo\n"}], + ['bs-sha-2', {IN=> {".\\foo"=> ''}}, {OUT=>"\\$sha_degenerate .\\\\foo\n"}], # The sha1sum and md5sum drivers share a lot of code. # Ensure that sha1sum does *not* share the part that makes |