summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--THANKS.in1
-rw-r--r--src/du.c15
-rw-r--r--src/wc.c12
-rw-r--r--tests/Makefile.am1
-rwxr-xr-xtests/du/files0-from-dir39
6 files changed, 59 insertions, 12 deletions
diff --git a/NEWS b/NEWS
index 9993469fa..658a89af7 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@ GNU coreutils NEWS -*- outline -*-
** Bug fixes
+ du would infloop when given --files0-from=DIR
+ [bug introduced in coreutils-7.1]
+
cut could segfault when invoked with a user-specified output
delimiter and an unbounded range like "-f1234567890-".
[bug introduced in coreutils-5.3.0]
diff --git a/THANKS.in b/THANKS.in
index b475eef73..fe53c4469 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -524,6 +524,7 @@ Soeren Sonnenburg sonnenburg@informatik.hu-berlin.de
Solar Designer solar@owl.openwall.com
Stanislav Ievlev inger@altlinux.ru
Stavros Passas stabat@ics.forth.gr
+Stefan Vargyas stvar@yahoo.com
Stéphane Chazelas Stephane_CHAZELAS@yahoo.fr
Stephen Depooter sbdep@myrealbox.com
Stephen Eglen eglen@pcg.wustl.edu
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)
diff --git a/src/wc.c b/src/wc.c
index ccf4ccfbc..039921470 100644
--- a/src/wc.c
+++ b/src/wc.c
@@ -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
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9603441b0..28eafe8ae 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -370,6 +370,7 @@ TESTS = \
du/exclude \
du/fd-leak \
du/files0-from \
+ du/files0-from-dir \
du/hard-link \
du/inacc-dest \
du/inacc-dir \
diff --git a/tests/du/files0-from-dir b/tests/du/files0-from-dir
new file mode 100755
index 000000000..fc1e1844c
--- /dev/null
+++ b/tests/du/files0-from-dir
@@ -0,0 +1,39 @@
+#!/bin/sh
+# ensure that du and wc handle --files0-from=DIR
+
+# Copyright (C) 2011 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
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+print_ver_ du wc
+
+mkdir dir
+
+# Skip this test if reading from a directory succeeds.
+# In that case, using --files0-from=dir would yield garbage,
+# interpreting the directory entry as a sequence of
+# NUL-separated file names.
+cat dir > /dev/null && skip_ "cat dir/ succeeds"
+
+for prog in du wc; do
+ $prog --files0-from=dir > /dev/null 2>err && fail=1
+ printf "$prog: dir:\n" > exp || fail=1
+ # The diagnostic string is usually "Is a directory" (ENOTDIR),
+ # but accept a different string or errno value.
+ sed 's/dir:.*/dir:/' err > k; mv k err
+ compare err exp || fail=1
+done
+
+Exit $fail