Thanks to Olivier Fourdan and Ondřej Vašík. Here's a patch for that bug:
>From e0e8429c2433bd9820f42250236badc585bd9dd7 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyer...@redhat.com> Date: Thu, 3 Sep 2009 19:36:34 +0200 Subject: [PATCH] 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". --- NEWS | 3 +++ THANKS | 1 + src/df.c | 5 ++++- tests/Makefile.am | 1 + tests/df/unreadable | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 1 deletions(-) create mode 100755 tests/df/unreadable diff --git a/NEWS b/NEWS index 59270eb..cb01227 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 ee18572..961785e 100644 --- a/THANKS +++ b/THANKS @@ -440,6 +440,7 @@ Olatunji Oluwabukunmi Ruwase tjruw...@stanford.edu Olav Morkrid o...@funcom.com Ole Laursen o...@hardworking.dk Oliver Kiddle okid...@yahoo.co.uk +Olivier Fourdan ofour...@redhat.com Ørn E. Hansen oehan...@daimi.aau.dk Oskar Liljeblad o...@hem.passagen.se Otavio Salvador ota...@ossystems.com.br diff --git a/src/df.c b/src/df.c index 787fcde..86fd0e3 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 0151cb0..d9ff95b 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 0000000..8e60028 --- /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 -- 1.6.4.2.395.ge3d52