bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] df: don't fail due to an unreadable argument


From: Jim Meyering
Subject: [PATCH] df: don't fail due to an unreadable argument
Date: Thu, 03 Sep 2009 19:59:36 +0200

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 <address@hidden>
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        address@hidden
 Olav Morkrid                        address@hidden
 Ole Laursen                         address@hidden
 Oliver Kiddle                       address@hidden
+Olivier Fourdan                     address@hidden
 Ørn E. Hansen                       address@hidden
 Oskar Liljeblad                     address@hidden
 Otavio Salvador                     address@hidden
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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]