summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2009-09-03 19:36:34 +0200
committerJim Meyering <meyering@redhat.com>2009-09-03 19:52:47 +0200
commite0e8429c2433bd9820f42250236badc585bd9dd7 (patch)
tree12128f28af5a7c86f570058a2531c6031355bf4a
parent1422cabf930572f22849c55914352e915af1f677 (diff)
downloadcoreutils-e0e8429c2433bd9820f42250236badc585bd9dd7.tar.xz
df: don't fail due to an unreadable argument
* src/df.c (main): If open or fstat fails when we're trying to ensure that all arg-partitions are automounted, fall back on using stat. Inspired by the report and patch from Olivier Fourdan in http://bugzilla.redhat.com/520630. * NEWS (Bug fixes): Mention it. * tests/df/unreadable: New test for the above. * tests/Makefile.am (TESTS): Add df/unreadable. The bug was introduced in coreutils-7.3 via commit dbd17157, 2009-04-28, "df: use open(2), not stat, to trigger automounting".
-rw-r--r--NEWS3
-rw-r--r--THANKS1
-rw-r--r--src/df.c5
-rw-r--r--tests/Makefile.am1
-rwxr-xr-xtests/df/unreadable32
5 files changed, 41 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 59270eb0a..cb0122786 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,9 @@ GNU coreutils NEWS -*- outline -*-
printing a summary to stderr.
[bug introduced in coreutils-6.11]
+ df no longer requires that each command-line argument be readable
+ [bug introduced in coreutils-7.3]
+
ls -i now prints consistent inode numbers also for mount points.
This makes ls -i DIR less efficient on systems with dysfunctional readdir,
because ls must stat every file in order to obtain a guaranteed-valid
diff --git a/THANKS b/THANKS
index ee18572d7..961785e0c 100644
--- a/THANKS
+++ b/THANKS
@@ -440,6 +440,7 @@ Olatunji Oluwabukunmi Ruwase tjruwase@stanford.edu
Olav Morkrid olav@funcom.com
Ole Laursen olau@hardworking.dk
Oliver Kiddle okiddle@yahoo.co.uk
+Olivier Fourdan ofourdan@redhat.com
Ørn E. Hansen oehansen@daimi.aau.dk
Oskar Liljeblad osk@hem.passagen.se
Otavio Salvador otavio@ossystems.com.br
diff --git a/src/df.c b/src/df.c
index 787fcde21..86fd0e32e 100644
--- a/src/df.c
+++ b/src/df.c
@@ -994,8 +994,11 @@ main (int argc, char **argv)
stats = xnmalloc (argc - optind, sizeof *stats);
for (i = optind; i < argc; ++i)
{
+ /* Prefer to open with O_NOCTTY and use fstat, but fall back
+ on using "stat", in case the file is unreadable. */
int fd = open (argv[i], O_RDONLY | O_NOCTTY);
- if (fd < 0 || fstat (fd, &stats[i - optind]))
+ if ((fd < 0 || fstat (fd, &stats[i - optind]))
+ && stat (argv[i], &stats[i - optind]))
{
error (0, errno, "%s", quote (argv[i]));
exit_status = EXIT_FAILURE;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0151cb091..d9ff95be4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -300,6 +300,7 @@ TESTS = \
cp/src-base-dot \
cp/symlink-slash \
cp/thru-dangling \
+ df/unreadable \
dd/direct \
dd/misc \
dd/not-rewound \
diff --git a/tests/df/unreadable b/tests/df/unreadable
new file mode 100755
index 000000000..8e6002860
--- /dev/null
+++ b/tests/df/unreadable
@@ -0,0 +1,32 @@
+#!/bin/sh
+# ensure that df can handle an unreadable argument
+
+# Copyright (C) 2009 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/>.
+
+if test "$VERBOSE" = yes; then
+ set -x
+ df --version
+fi
+
+. $srcdir/test-lib.sh
+skip_if_root_
+
+fail=0
+touch unreadable || fail=1
+chmod a-r unreadable || fail=1
+df unreadable || fail=1
+
+Exit $fail