diff options
author | Jim Meyering <meyering@redhat.com> | 2011-03-02 19:16:46 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2011-03-03 09:05:44 +0100 |
commit | caaf2899f67d312d76af91add2a4d9f7be2d5c61 (patch) | |
tree | 5b11c3ce27d9d74b258f7720fd2e3130617d0a20 /src | |
parent | 7cfd12c78e0be4c90f29c99ab383163aa1471504 (diff) | |
download | coreutils-caaf2899f67d312d76af91add2a4d9f7be2d5c61.tar.xz |
du: don't infloop for --files0-from=DIR
* src/du.c (main): Fail on AI_ERR_READ error, rather than merely
diagnosing and continuing. Based on a patch by Stefan Vargyas.
Also move the handling of AI_ERR_EOF into the case stmt.
Do not report ferror/fclose(stdin) failure when we've
already diagnosed e.g., failure to read the DIR, above.
Bug introduced by 2008-11-24 commit 031e2fb5, "du: read and
process --files0-from= input a name at a time,".
* src/wc.c: Handle read failure as with du: do not exit
immediately, but rather go on to print any total and to clean-up.
As above, move the handling of AI_ERR_EOF into the case stmt.
* tests/du/files0-from-dir: New file, to test both du and wc.
* tests/Makefile.am (TESTS): Add it.
* NEWS (Bug fixes): Mention it.
Diffstat (limited to 'src')
-rw-r--r-- | src/du.c | 15 | ||||
-rw-r--r-- | src/wc.c | 12 |
2 files changed, 15 insertions, 12 deletions
@@ -926,19 +926,19 @@ main (int argc, char **argv) bool skip_file = false; enum argv_iter_err ai_err; char *file_name = argv_iter (ai, &ai_err); - if (ai_err == AI_ERR_EOF) - break; if (!file_name) { switch (ai_err) { + case AI_ERR_EOF: + goto argv_iter_done; case AI_ERR_READ: - error (0, errno, _("%s: read error"), quote (files_from)); - continue; - + error (0, errno, _("%s: read error"), + quotearg_colon (files_from)); + ok = false; + goto argv_iter_done; case AI_ERR_MEM: xalloc_die (); - default: assert (!"unexpected error code from argv_iter"); } @@ -985,11 +985,12 @@ main (int argc, char **argv) ok &= du_files (temp_argv, bit_flags); } } + argv_iter_done: argv_iter_free (ai); di_set_free (di_set); - if (files_from && (ferror (stdin) || fclose (stdin) != 0)) + if (files_from && (ferror (stdin) || fclose (stdin) != 0) && ok) error (EXIT_FAILURE, 0, _("error reading %s"), quote (files_from)); if (print_grand_total) @@ -722,16 +722,17 @@ main (int argc, char **argv) bool skip_file = false; enum argv_iter_err ai_err; char *file_name = argv_iter (ai, &ai_err); - if (ai_err == AI_ERR_EOF) - break; if (!file_name) { switch (ai_err) { + case AI_ERR_EOF: + goto argv_iter_done; case AI_ERR_READ: - error (EXIT_FAILURE, errno, _("%s: read error"), - quote (files_from)); - continue; + error (0, errno, _("%s: read error"), + quotearg_colon (files_from)); + ok = false; + goto argv_iter_done; case AI_ERR_MEM: xalloc_die (); default: @@ -773,6 +774,7 @@ main (int argc, char **argv) else ok &= wc_file (file_name, &fstatus[nfiles ? i : 0]); } + argv_iter_done: /* No arguments on the command line is fine. That means read from stdin. However, no arguments on the --files0-from input stream is an error |