df: don't fail due to an unreadable argument
authorJim Meyering <meyering@redhat.com>
Thu, 3 Sep 2009 17:36:34 +0000 (19:36 +0200)
committerJim Meyering <meyering@redhat.com>
Thu, 3 Sep 2009 17:52:47 +0000 (19:52 +0200)
* 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
THANKS
src/df.c
tests/Makefile.am
tests/df/unreadable [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 59270eb0a5ae35f987b9dc9301fbeed5ef81845b..cb01227860a22bc891b9e0d3be6a15d680f15aa7 100644 (file)
--- 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 ee18572d794a39371bd8178d2d892d8231e6739e..961785e0c5c4b4fe9dec7f6a2a5c2d2be99fbf06 100644 (file)
--- 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
index 787fcde214d1bbb18bbdda7c4f56db0d891a7c2e..86fd0e32e7d87c2baa20944064adcd32c88c2e77 100644 (file)
--- 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;
index 0151cb091462bfb9a54ca5ed0f486dc3d81a8e4a..d9ff95be47dfcbad0c66f4f37d815e75bd43cc37 100644 (file)
@@ -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 (executable)
index 0000000..8e60028
--- /dev/null
@@ -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