[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] df: don't fail due to an unreadable argument,
Jim Meyering <=