summaryrefslogtreecommitdiff
path: root/src/du.c
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2011-03-02 19:16:46 +0100
committerJim Meyering <meyering@redhat.com>2011-03-03 09:05:44 +0100
commitcaaf2899f67d312d76af91add2a4d9f7be2d5c61 (patch)
tree5b11c3ce27d9d74b258f7720fd2e3130617d0a20 /src/du.c
parent7cfd12c78e0be4c90f29c99ab383163aa1471504 (diff)
downloadcoreutils-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/du.c')
-rw-r--r--src/du.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/du.c b/src/du.c
index 671cac784..67841a3de 100644
--- a/src/du.c
+++ b/src/du.c
@@ -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)